2017-02-22 8 views
2

ファイルからのデータをそのテキストファイルの各行の等高線図としてプロットするPythonプログラムがあります。現在、私のインターフェースには3つの別々の等高線図があります。私がファイルからデータを読み込んだり、スクリプトを実行する前にメモリにロードしても輪郭プロットから〜6fpsしか得ることはできません。matplotlibの等高線図を再描画する速度を向上させる

私はまた1輪郭だけを使って試してみましたが、残りは通常のプロットですが、速度は7fpsに増加しました。私はそれが数行を描くことに計算上課税しているとは思わない。実質的に速くする方法はありますか?理想的には、少なくとも30fpsを得ることは理想的です。

私は輪郭を描く方法は、私のデータの各行のために、私は以前のものを削除することです:

for coll in my_contour[0].collections: 
    coll.remove() 

とコードの先頭に新しい1

my_contour[0] = ax[0].contour(x, y, my_func, [0]) 

を追加し、私はplt.ion()を追加してプロットを更新しています。

ご協力いただければ幸いです。ここで

おかげ

+0

プロットを更新できる速度は、(a)新しいデータを計算するのにかかる時間と(b)軸を描画するのにかかる時間の2つに依存します。あなたのケースではどちらが時間がかかるのかは一般に難しいです。残念なことに、 'contour 'はすべての反復でデータを再計算する必要があるため、期待される利益はほとんどありません。描画時間は、ブリッティングを使用することによって潜在的に減少する可能性がありますが、これにより7〜30fpsになることは間違いありません。 – ImportanceOfBeingErnest

+0

さて、もっと輪郭を追加しても、fpsは大幅に減少しません。今度は6輪郭を試しました。私は5.5~6.5fpsを得ました.7~5.5fpsが得られたとき、matplotlibに何か起こっていることが永久にアニメーション化するプロットを更新するときに起こります。また、輪郭プロットのメッシュ密度を大幅に下げると、フレームレートがわずかにfpsだけ増加します。 – UN4

+0

これは[blitting](http://stackoverflow.com/questions/40126176/fast-live-plotting-in-matplotlib-pyplot)のように聞こえるのは確かに利点があります。 – ImportanceOfBeingErnest

答えて

2

はアニメーションでcontourプロットを使用する方法の例です。それは、blitをオンまたはオフにするのを容易にするmatplotlib.animation.FuncAnimationを使用します。 blit = Trueの場合、私のマシン上で~64 fpsで実行され、〜55 fpsでblitせずに実行されます。もちろん、intervalは高速アニメーションを可能にする必要があります。 interval=10(ミリ秒)に設定すると、最大100fpsが可能になりますが、描画時間はそれよりも遅いものに制限されます。

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

x= np.linspace(0,3*np.pi) 
X,Y = np.meshgrid(x,x) 
f = lambda x,y, alpha, beta :(np.sin(X+alpha)+np.sin(Y*(1+np.sin(beta)*.4)+alpha))**2 
alpha=np.linspace(0, 2*np.pi, num=34) 
levels= 10 
cmap=plt.cm.magma 


fig, ax=plt.subplots() 
props = dict(boxstyle='round', facecolor='wheat') 
timelabel = ax.text(0.9,0.9, "", transform=ax.transAxes, ha="right", bbox=props) 
t = np.ones(10)*time.time() 
p = [ax.contour(X,Y,f(X,Y,0,0), levels, cmap=cmap) ] 

def update(i): 
    for tp in p[0].collections: 
     tp.remove() 
    p[0] = ax.contour(X,Y,f(X,Y,alpha[i],alpha[i]), levels, cmap= cmap) 
    t[1:] = t[0:-1] 
    t[0] = time.time() 
    timelabel.set_text("{:.3f} fps".format(-1./np.diff(t).mean())) 
    return p[0].collections+[timelabel] 

ani = matplotlib.animation.FuncAnimation(fig, update, frames=len(alpha), 
             interval=10, blit=True, repeat=True) 
plt.show() 

enter image description here

画像を保存するプロセスは少し時間がかかるので、アニメーションGIFに遅いフレームレートが、示されている上にあることに注意してください。

+0

これはすばらしいことですが、私の6輪郭はすべて50fpsで動作します!巨大な改善!ありがとう! – UN4

+0

ありがとうございました。これらのアニメーションがどのように直感的ではないのか、 'QuadContour'オブジェクトで' set_array'を使用しようとすると、全てのアーティストを作成しようとして失敗し、 'ArtistAnimation'を使用できませんでした。唯一の答えは、** 'ArtistAnimation' **の背後にあるプロセスを実行し、**この作業を' FuncAnimation'で行うことです。 matplotlibは本当にここで仕事が必要です。 –

+0

@ LukeDavis問題が何であるかはわかりません。私は、4つのコメント行が実際には十分に明確な説明のためには短すぎると思うので、あなたがエンカウンターする問題について新しい質問をするかもしれません。 – ImportanceOfBeingErnest

関連する問題