调用 savefig 后 Python matplotlib 更新图

Posted

技术标签:

【中文标题】调用 savefig 后 Python matplotlib 更新图【英文标题】:Python matplotlib Update figure after savefig called 【发布时间】:2011-02-17 13:40:39 【问题描述】:

我的问题是: 我在 PyGTK 应用程序中有 Matplotlib 图形,每隔几秒钟就会不断更新。我添加了将图形作为 PNG 文件保存到磁盘的功能。调用figure.savefig(filename, other parameters) 后,我在应用程序中的图形停止更新。

图初始化阶段:

# setup matplotlib stuff on empty space in vbox4
    figure = Figure()
    canvas = FigureCanvasGTK(figure) # a gtk.DrawingArea
    canvas.show()
    self.win.get_widget('vbox4').pack_start(canvas, True, True) # this will be aded to last place
    self.win.get_widget('vbox4').reorder_child(canvas, 1) #place plot to space where it should be

图形正在以这种方式更新(这在单独的线程中每隔几秒调用一次):

def _updateGraph(self, fig, x, x1, y):
    #Various calculations done here

    fig.clf()#repaint plot: delete current and formate a new one
    axis = fig.add_subplot(111)
    #axis.set_axis_off()
    axis.grid(True)
#remove ticks and labels
    axis.get_xaxis().set_ticks_position("none")
    for i in range(len(axis.get_xticklabels())): axis.get_xticklabels()[i].set_visible(False)
    axis.get_yaxis().set_ticks_position("none")
    axis.plot(numpy.array(x),numpy.array(y)/(1.0**1), "k-" ,alpha=.2)
    axis.set_title('myTitle')
    fig.autofmt_xdate()
    fig.canvas.draw()

一切都按预期进行。但调用后:

figure.savefig(fileName, bbox_inches='tight', pad_inches=0.05)

文件已保存,但我的屏幕上的人物停止更新

任何想法如何将图保存到磁盘并仍然能够在屏幕上更新我的图?

【问题讨论】:

一个独立的例子可能会有所帮助。也就是说,没有人知道“gui”是什么,如何从这些代码片段中调用 savefig 等等。当然,您会希望将其缩减为不是太多行但会显示问题的内容。 感谢您帮助我。是的,我知道这段代码没用,不能独立运行。图保存方法由按钮按下事件调用。 gui.w().get("figureMain") 是我个人的全球使用对象。它只是一个变量。我将尝试创建示例应用程序 【参考方案1】:

您是否尝试过更新线条数据而不是重新创建图形?这假设数据点的数量不会改变每一帧。它可能有助于解决拒绝更新的问题,至少它会更快。

def _updateGraph(self, fig, x, x1, y): 
    #Various calculations done here 


    ydata = numpy.array(y)/(1.0**1)

    # retrieved the saved line object
    line = getattr(fig, 'animated_line', None);

    if line is None:
        # no line object so create the subplot and axis and all 
        fig.clf()
        axis = fig.add_subplot(111) 

        axis.grid(True) 
        #remove ticks and labels 
        axis.get_xaxis().set_ticks_position("none") 
        for i in range(len(axis.get_xticklabels())): 
            axis.get_xticklabels()[i].set_visible(False) 
        axis.get_yaxis().set_ticks_position("none")             
        xdata = numpy.array(x);
        line = axis.plot(xdata, ydata, "k-" ,alpha=.2) 
        axis.set_title('myTitle') 
        fig.autofmt_xdate() 

        # save the line for later reuse
        fig.animated_line = line
    else:
        line.set_ydata(ydata)
    fig.canvas.draw() 

【讨论】:

【参考方案2】:

我找到了解决此问题的方法。由于我的身材在致电figure.savefig() 后拒绝更新,所以我找到了一种解决方法。我的图在 HBox2 容器中(GUI 是使用 Glade 3.6.7 创建的)作为第一个元素

#   some stuff going
    figure.saveFig(fileName)
#   WORK-A-ROUND: delete figure after calling savefig()
    box = self.win.get_widget('hbox2')
    box.remove(box.get_children()[0])
    self._figPrepare()

def _figPrepare(self):  #initialize graph
    figure = Figure()
    canvas = FigureCanvasGTK(figure) # a gtk.DrawingArea
    canvas.show()       
    figure.clf()
    gui.w().set("figure", figure)
    self.win.get_widget('hbox2').pack_start(canvas, True, True) # this will be aded to last place
    self.win.get_widget('hbox2').reorder_child(canvas, 0) #place plot to space where it should be

我知道这不是最佳做法,而且可能很慢,但它对我来说没问题。希望其他人会发现这很有用

【讨论】:

【参考方案3】:

来自http://matplotlib.org/examples/user_interfaces/embedding_in_gtk2.html

似乎有帮助的是“agg”不确定这意味着什么,但为我修复了这个错误:)

from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas

【讨论】:

以上是关于调用 savefig 后 Python matplotlib 更新图的主要内容,如果未能解决你的问题,请参考以下文章

python 画图后柱状图保存到本地方法 plt.savefig("filename.png") python 使用 plt 画图后保存到本地 python保存柱状图/

Python Matplotlib 中如何用 plt.savefig 存储图片

在 ipython 中调用 pylab.savefig 而不显示

Python:Savefig 切断标题

python使用matplotlib的savefig保存时图片保存不清晰以及不完整的问题

使用 matplotlib 的 savefig 保存从 python pandas 生成的图(AxesSubPlot)