2011-06-21 124 views
2

我有一個巨大的數組,我試圖創建一個動畫效果。我的方法是:matplotlib動畫與工具欄

def initPlot(self): 
    if not hasattr(self, 'axes'): 
     self.axes = self.figure.add_subplot(111) 

    self.axes.set_title('Monitor data', size=12) 

    pylab.setp(self.axes.get_xticklabels(), fontsize=8) 
    pylab.setp(self.axes.get_yticklabels(), fontsize=8) 
    self.maxy = 0 
    self.miny = 0 
    for i, pt_list in enumerate(self.point_lists):    
     plot_pts = num.array(pt_list) 
     clr = self.clr_list[i] 
     self.plot_data = self.axes.plot(plot_pts, linewidth= 1.0, color=clr,)[0] 
     self.plot_data.set_xdata(num.arange(len(plot_pts))) 
     self.plot_data.set_ydata(plot_pts) 
     maxPlot = plot_pts.max() 
     minPlot = plot_pts.min() 
     if maxPlot > self.maxy: 
      self.maxy = maxPlot 
     if minPlot < self.miny: 
      self.miny = minPlot 


def draw(self): 
    """Draw data."""     
    self.axes.set_xbound(lower=self.startPosition, upper=self.startPosition + 1000) 
    self.axes.set_ybound(lower=self.miny - 50, upper = self.maxy + 50)   
    self.canvas.draw() 


def onTimerPassed(self, event): 
    if self.animation: 
     self.startPosition = self.startPosition + 10 
     self.draw() 

現在這工作正常,動畫是我所期望的。不過,我還需要集成NavigationToolbar2WxAgg。這是我的問題。當動畫處於活動狀態時,任何縮放/重新定位等都會從self.canvas.draw()中自動取消。所以我的問題是,我該如何進行繪圖更新以保持工具欄的設置?

問候, 波格丹

回答

2

您強制的限制是(指定startPosition,指定startPosition + 1000)和(MINY-50,MINY + 50)在你的draw()方法。對於你的下一幀,你必須根據目前的限制來推斷你的限制應該是什麼。

假設您希望xlim每增加1000幀,但保留yscale。你可以做到以下幾點:

def draw(self): 
    xlim = self.axes.get_xlim() 
    self.axes.set_xlim(xlim[0]+1000, xlim[1]+1000) 
    # ylim unchanged 
    self.canvas.draw() 
+0

謝謝,這是訣竅。 – Bogdan