Python matplotlib Обновление фигуры после вызова savefig - PullRequest
1 голос
/ 17 февраля 2011

Моя проблема: У меня есть фигура Matplotlib в приложении PyGTK, которая постоянно обновляется каждые несколько секунд. Я добавил возможность сохранять фигуру на диск в формате 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)

Файл был сохранен, НО моя фигура на экране перестает обновляться .

Есть какие-нибудь идеи, как сохранить фигуру на диск и при этом иметь возможность обновлять мою фигуру на экране?

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

Вы пытались обновить данные линии вместо воссоздания фигуры? Это предполагает, что количество точек данных не меняет каждый кадр. Это может помочь при отказе от обновления, и, по крайней мере, будет быстрее.

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() 
0 голосов
/ 15 февраля 2013

из http://matplotlib.org/examples/user_interfaces/embedding_in_gtk2.html

мне кажется, что «agg» не уверен, что это значит, но исправил эту ошибку для меня

0 голосов
/ 09 мая 2012

Я нашел обходной путь к этому.Поскольку моя цифра отказывается обновляться после вызова 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

Я знаю, что это не лучшая практика и, вероятно, медленная, но у меня она работает нормально.Надеюсь, кто-то еще найдет это полезным

...