2011-06-09 67 views
3

我有一个wxPython应用程序,其中包含一个matplotlib面板(礼貌wxmpl,虽然我已经看到一个简单的图像CanvasWxAgg画布相同)。动画Matplotlib面板 - blit叶子旧框架

我想要在面板中绘制一张图的动画,过去我也做过类似的事情。我在做它的方式是建议:

  • 副本背景
  • 情节
  • [...]
  • 恢复背景
  • 更新行数据
  • 平局艺术家
  • blit

问题是这些情节,而不是被背景恢复“覆盖”,停留在那里,整个事情可以理解地看起来很乱。

一些(简化)代码:

fig = self.myPanel.get_figure() 
ax_top = fig.add_subplot(211) 
ax_bottom = self.fig.add_subplot(212) 
canvas = fig.canvas 
canvas.draw() 
bg_top = canvas.copy_from_bbox(ax_top.bbox) 
bg_bottom = canvas.copy_from_bbox(ax_bottom.bbox) 
line, = ax_bottom.plot(x, y, 'k', animated=True) 

然后,在更新:

canvas.restore_region(bg_bottom) 
line.set_ydata(new_y) 
ax_bottom.draw_artist(line) 
canvas.blit(ax_bottom.bbox) 

新的生产线被画出(和非常快的:),但由于某种原因它发生在老线。任何人都可以猜测为什么?

+0

在直觉上,在调用'fig.canvas.copy_from_bbox'之前尝试调用'fig.canvas.draw()'。确切的行为取决于后端,因此它在不同的平台上会有所不同,但通常来说,在尝试从它复制事物之前,您需要绘制画布。 – 2011-06-09 02:08:28

+0

@Joe感谢您的建议。不幸的是,它没有区别(更新代码以反映变化) – Agos 2011-06-09 09:46:41

+0

@Joe没关系,我把它拿回来。你是对的!我没有完成加载/布局/绘图/重新绘制其他东西,所以我复制了一个更好的时刻,它的工作原理。请添加一个答案,以便我可以接受它:) – Agos 2011-06-09 10:32:24

回答

4

添加为答案,要求:)

尝试调用fig.canvas.copy_from_bbox之前调用fig.canvas.draw()。确切的行为取决于后端,因此它在不同的平台上会有所不同,但通常来说,在尝试从它复制事物之前,您需要绘制画布。

2

使用FigureCanvasWxAgg进行测试。我认为会发生的是,在初始化面板和坐标轴之间,然后绘制轴被移动或调整大小等。尝试等待得到那些背景,直到你真正吸取, 即当你初始化帧/面板:

... 
bg_top = None 
bg_bottom = None 
line, = ax_bottom.plot(x, y, 'k', animated=True) 
... 

的,当你更新:

def update(self, evt): 
    if bf_top is None: 
     bg_top = canvas.copy_from_bbox(ax_top.bbox) 
     bg_bottom = canvas.copy_from_bbox(ax_bottom.bbox) 
    canvas.restore_region(bg_bottom) 
    line.set_ydata(new_y) 
    ax_bottom.draw_artist(line) 
    canvas.blit(ax_bottom.bbox) 
0

您必须在“draw_event”链接到一个新副本的背景。 否则,旧的背景将始终处于所需的背景上,并且只能在工具栏中使用缩放或平移。这个对我有用。

Martin。