简体   繁体   中英

Python matplotlib Update figure after savefig called

My problem is: I have Matplotlib figure in PyGTK application, that is constatly updated each few seconds. I've added abbility to save figure to disk as PNG file. After calling figure.savefig(filename, other parameters) my figure in application stops being updated.

Figure initialization phase:

# 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

Figure is being updated this way (this called each few seconds in separate thread):

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()

everything works as expected. But after calling:

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

File have been saved, BUT my figure on screen stops being updated .

Any ideas how do I save figure to disk and still be able to update my fig on screen ?

Have you tried updating the line data instead of recreating the figure? This assumes the number of datapoints doesn't change each frame. It might help issue of things refusing to update, and at the least it will be faster.

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() 

I have found a work-a-round to this. As my figure refuses to be updated after calling figure.savefig() so i found a way how to work a round it. My figure is within HBox2 container (GUI is created with Glade 3.6.7) as first element

#   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

I know this is not best practice, and probably is slow, but it work OK for me. Hope someone else will find this useful

from http://matplotlib.org/examples/user_interfaces/embedding_in_gtk2.html

what seems to help is the "agg" not sure what that means but fixed this bug for me :)

from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM