2013-09-06 3 views
0

Я пытаюсь создать простой просмотрщик временных рядов, который будет иметь следующую кнопку, чтобы перейти к следующим временным рядам и кнопке воспроизведения, которая будет итерации по всему набору временных рядов. Код удивительно супер медленный (1 кадр в секунду), даже если я использую set_ydata. Это так хорошо, как питон? Когда я нажимаю кнопку воспроизведения, программа замерзает после 5-6 слайдов.matplotlib tkinter очень медленно и замерзает при перерисовке 2D-графиков

Вот код:

from tkinter import Tk, Button 
import numpy 
import matplotlib.pyplot as pyplot 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
import scipy 
from scipy import io 

class Viewer: 
    _rawData = None 
    _featureMatrix = None 
    _root = None 
    _t = None 
    _index = 0 
    _T = None 
    _N = None 
    _plot = None 
    _nextButton = None 
    _figure = None 
    _axes = None 
    _canvas = None 
    _toolbar = None 
    def __init__(self, rawData, featureMatrix = []): 
     # keep local copy of data 
     self._rawData = rawData 
     self._featureMatrix = featureMatrix 
     self._T = rawData.shape[1] 
     self._N = rawData.shape[0] 
     self._t = numpy.arange(self._T) 
     # GUI SETUP 
     self._root = Tk() 
     self._nextButton = Button(self._root, text="next", command = self.next) 
     self._nextButton.grid(row=0, column=0) 
     self._playButton = Button(self._root, text="play", command = self.play) 
     self._playButton.grid(row=1, column=0) 
     # init figure 
     self._figure = pyplot.figure() 
     self._axes = self._figure.add_subplot(111) 
     self._canvas = FigureCanvasTkAgg(self._figure, master=self._root) 
     self._toolbar = NavigationToolbar2TkAgg(self._canvas, self._root) 
     self._canvas.get_tk_widget().grid(row=0,column=1) 
     self._toolbar.grid(row=1,column=1) 
     # draw first time series 
     self.draw_ts() 
     self._root.mainloop() 
    def next(self): 
     self._index = self._index + 1 % self._N 
     self.draw_ts() 
    def play(self): 
     for i in range(self._N): self.next() 
    def draw_ts(self): 
     pyplot.clf() # clear figure 
     #if self._plot is None: 
     self._plot, = pyplot.plot(self._t, self._rawData[self._index, :]) # the annoying comma is to output an object and not a list of objects 
     #else: 
     # self._plot.set_ydata(self._rawData[self._index, :]) 
     pyplot.title("time series index # %d/%d" % (self._index, self._N)) 
     #self._axes.relim() 
     #self._axes.autoscale_view(True,True,True) 
     self._canvas.draw() 

if __name__ == "__main__": 
    x = numpy.random.random([1000, 100]) 
    iv = Viewer(x) 
+0

вы хотите заглянуть в 'blit'ing – tacaswell

+0

Вы пытались установить данные оси вместо повторного построения графика? – rafaelvalle

ответ

0

упс, я думаю, что это было pyplot.clf(), который вызвал длительную задержку. Теперь он работает быстрее (все еще немного медленнее ~ 7 Гц). Если я включу игру, она снова замерзает после нескольких слайдов. Я думаю, потому что он пытается рисовать, прежде чем заканчивать предыдущий рисунок или что-то в этом роде.

Смежные вопросы