2013-04-20 3 views
6

をアニメーション化。この単純な例を挙げる:私は2つの線を持ち、私は常にそれらの間を埋める。もちろん、線は変化し、アニメーション化されます。matplotlibのは、私はmatplotlibの内部fill_between形状をアニメーション化しようとしていると私はPolyCollectionのデータを更新する方法がわからないfill_between形状

import matplotlib.pyplot as plt 

# Init plot: 
f_dummy = plt.figure(num=None, figsize=(6, 6)); 
axes_dummy = f_dummy.add_subplot(111); 

# Plotting: 
line1, = axes_dummy.plot(X, line1_data, color = 'k', linestyle = '--', linewidth=2.0, animated=True); 
line2, = axes_dummy.plot(X, line2_data, color = 'Grey', linestyle = '--', linewidth=2.0, animated=True); 
fill_lines = axes_dummy.fill_between(X, line1_data, line2_data, color = '0.2', alpha = 0.5, animated=True); 

f_dummy.show(); 
f_dummy.canvas.draw(); 
dummy_background = f_dummy.canvas.copy_from_bbox(axes_dummy.bbox); 

# [...]  

# Update plot data: 
def update_data(): 
    line1_data = # Do something with data 
    line2_data = # Do something with data 
    f_dummy.canvas.restore_region(dummy_background); 
    line1.set_ydata(line1_data); 
    line2.set_ydata(line2_data); 

    # Update fill data too 

    axes_dummy.draw_artist(line1); 
    axes_dummy.draw_artist(line2); 

    # Draw fill too 

    f_dummy.canvas.blit(axes_dummy.bbox); 

質問は)(line1_dataに基づいてfill_betweenポリデータとline2_dataたびupdate_dataを更新するために呼び出され、ブリット前にそれらを描く方法です(「#更新フィルデータ:ここ

はダミー例です& "#塗りつぶしも")。私は成功せず)(fill_lines.set_vertsを試してみましたが、一例を見つけることができませんでした...

ありがとう!誰かが指摘したように

+1

あなたは削除して、完全にすべてのフレームを再描画する必要があるかもしれません。 '* collection'オブジェクトは更新するとうまくいきません。その理由は、データスペースと描画スペースの間のマッピングを可能にするすべてのメタデータを投げ捨て、描画するもののリストを保持することだけです。これはすぐにレンダリングするトレードオフです。 – tacaswell

+0

update_dataの中にf_dummy.canvas.draw()を使用しますか?私はこれで始めましたが、残念ながら、リアルタイムで信号を処理して再生しているので、高速なプロットが必要です。再生に影響を与えないようにプロットする必要があります(draw()を呼び出すと再生が停止します)。サウンドを再生しながらすべてを再描画するための高速なスレッド技を知っているなら、素敵です - 私はthreading.start(...)を使ってdrawを呼び出しました。私は他のより速いプロットライブラリがあることを知っていますが、私はmatplotlibに固執することを好み、リストア/ blitトリックは私のために十分速く働いていました。 – Sebastian

答えて

3

[OK]を、私たちはここにコレクションを扱っているので、我々は、この軸オブジェクト axes_dummy = f_dummy.add_subplot(111)与えられた

を削除して再描画する必要があります。そうどこかupdate_dataで

():必要になります。 。

に関連付けられているすべてのコレクションを削除するには、それ

for coll in (axes_dummy.collections): 
    axes_dummy.collections.remove(coll) 

同様のトリックが満たされた1の上に充填されていない等高線図をオーバーレイするために必要とされる新しい「filled_between」Polycollection

axes_dummy.fill_between(x,y-sigma,y+sigma, 
        facecolor='yellow', alpha=0.5) 

、以降を描きます未充填等高線図(?私は仮定ラインの)だけでなくコレクションです

+1

コレクションを1つだけ削除したい場合は、 'collection.label()'を使用してコレクションを最初にラベル付けしたものを入手できます。 – Sardathrion

1

は、これが私の答えではありませんが、私はそれが最も有用であることが判明:

http://matplotlib.1069221.n5.nabble.com/animation-of-a-fill-between-region-td42814.html

こんにちはマウリシオとは異なり、ラインオブジェクトは、ユーザによって供給された入力データから除去ステップであるため、 パッチオブジェクトは、もう少し困難で動作するようにラインオブジェクトよりもあります。 http://matplotlib.org/examples/animation/histogram.html

基本的に、各フレームでパスの頂点を変更する必要があります。

from matplotlib import animation 
import numpy as np 
import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
ax.set_xlim([0,10000]) 

x = np.linspace(6000.,7000., 5) 
y = np.ones_like(x) 

collection = plt.fill_between(x, y) 

def animate(i): 
    path = collection.get_paths()[0] 
    path.vertices[:, 1] *= 0.9 

animation.FuncAnimation(fig, animate, 
         frames=25, interval=30) 

どのように配置されているかを確認するには、path.verticesをご覧ください。その後、

コールfill_lines.remove()と再び呼び出すaxes_dummy.fill_between(): あなたがanitmationを使用しない、または唯一の充填を更新するためにあなたの姿からすべてを削除する場合は、あなたが私の方法を使用することができ、 ジェイク

1

を役に立てば幸い新しいものを描く。私のために働いた。

関連する問題