2011-06-09 33 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。