2012-04-28 112 views
9

我正在使用wxPython在y軸上的數據限制隨數據更改而繪製的圖中繪製數據。我想動態地改變軸,而不用重新繪製整個畫布,如canvas.draw(),而是我想用blitting來做這件事,就像我爲情節本身做的那樣。matplotlib動畫圖不會更新軸上的標籤使用blit

我開始工作的是變化的y軸,我得到了yticks與情節動畫,不幸的是ylabels已經消失了,我找不到解決方案。原因是設置軸的get_yaxis().set_animated(True)設置。

我在下面放了一個小實例。 我在這裏錯過了什麼?

import matplotlib 
matplotlib.use('WXAgg') 

import wx 
import pylab as p 
import numpy as npy 
from time import sleep 

ax = p.subplot(111) 
canvas = ax.figure.canvas 
x = npy.arange(0,2*npy.pi,0.01) 
line, = p.plot(x, npy.sin(x), animated=True) 

ax.get_yaxis().set_animated(True) 

def update_line(*args): 
    if update_line.background is None: 
     update_line.background = canvas.copy_from_bbox(ax.bbox) 

    for i in range(20): 
     canvas.restore_region(update_line.background) 

     line.set_ydata((i/10.0)*npy.sin(x)) 
     ax.set_ylim(-1*i/5.0-0.5,i/5.0+0.5) 

     ax.draw_artist(ax.get_yaxis()) 

     ax.draw_artist(line) 

     canvas.blit(ax.bbox) 

     sleep(0.1) 
    print 'end' 


update_line.cnt = 0 
update_line.background = None 
wx.EVT_IDLE(wx.GetApp(), update_line) 
p.show() 

基本上我正在尋找像get_ylabels().set_animated(True)之類的東西,但我無法找到它。

回答

7

它看起來像標籤被繪製,但blit命令不會將它們複製到畫布上,因爲邊界框只包含軸的內部部分。

對我而言,將update_line.background = canvas.copy_from_bbox(ax.bbox)更改爲update_line.background = canvas.copy_from_bbox(ax.get_figure().bbox)canvas.blit(ax.bbox)更改爲canvas.blit(ax.clipbox)

+0

謝謝你回答這個問題,這確實對我有用,那太棒了! – Merlin 2012-05-23 15:26:38

+0

這非常有幫助!感謝您提交此答案。動畫yaxis和刻度標籤突然變得清晰。 – achennu 2013-04-13 15:06:38

+0

我知道這是一箇舊的線程,但'ax.clipbox'給我None,所以這個失敗。有任何想法嗎? – 2013-08-22 17:35:15