2012-04-28 57 views
9

私はy軸上のデータ制限がデータと共に変化するwxPythonを使用してプロットにデータをプロットしています。 canvas.draw()のようにキャンバス全体を再描画せずに軸を動的に変更したいのですが、プロット自体のようにblittingを使用したいと思います。matplotlibアニメーションプロットはblitを使用して軸上のラベルを更新しません

y軸の変化があり、プロットでアニメーションが表示されますが、残念ながら、イザベルは消えてしまい、解決策を見つけることができません。理由は軸の設定を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

+0

これは非常に役に立ちました!この回答をお寄せいただきありがとうございます。 yaxisとtickラベルのアニメーションが突然明確になりました。 – achennu

+0

これは古いスレッドだとは知っていますが、 'ax.clipbox'は私にNoneを与えます。これは失敗します。何か案は? –

関連する問題