2011-06-21 83 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