2012-03-26 12 views
4

私はPythonでkmeansクラスタリングアルゴリズムを実装しています。私は各繰り返しでクラスタ品質の状態(画像)をプロットしたいと思います。ですから、基本的には、各繰り返しで画像をプロットするサイクルがあり、これをアニメーション化したいと思います。私はそれを明確にしたかどうかわかりません。現時点では、画像をプロットするshow()コマンドを使用していますが、繰り返しを続けるには閉じる必要があります。matplotlib Pythonで一連の画像をプロットする

したがって、各ステップで計算された画像のシーケンスをアニメーション化する方法はありますか?

答えて

0

ただ、対話モードを有効:

ion() 
show() 

をそして、それは動作します。これは少し奇妙です。しかし、覚えておいてください:Pythonスクリプトの終わりに、ウィンドウを閉じます。ウィンドウを閉じたくない場合は、スクリプトの最後に

ion() 
show() 

と電話する必要があります。

4

私はion()メソッドを試してみましたが、データ量は少なくても問題ありませんが、比較的速く大きな画像や画像をストリーミングすると、この方法は非常に遅いです。私が理解しているところでは、ion()は、あなたが望むものではないかもしれない軸やラベルなど、あなたのFigureを変更するたびにすべてを描き直します。

import time 
import numpy 
import matplotlib.pyplot as plt 


fig = plt.figure(1) 
ax = fig.add_subplot(111) 
ax.set_title("My Title") 

im = ax.imshow(numpy.zeros((256, 256, 3))) # Blank starting image 
fig.show() 
im.axes.figure.canvas.draw() 

tstart = time.time() 
for a in xrange(100): 
    data = numpy.random.random((256, 256, 3)) # Random image to display 
    ax.set_title(str(a)) 
    im.set_data(data) 
    im.axes.figure.canvas.draw() 

print ('FPS:', 100/(time.time() - tstart)) 

私は上記のコードで私のマシン上では約30 FPSを得る:

This threadは、ここで私はこれを行う方法を示したことの単純な例です

もの

を行うための非常に良くする方法を示しています。私が代わりに im.axes.figure.canvas.draw()im.set_data(data)plt.ion()ax.imshow(data)と同じことを実行すると、私は約1 FPS

1

使用pause()を取得します。私は有用であり得る画像シーケンスの可視化ユーティリティを実装している

import matplotlib.pyplot as plt 
for i in range(video.shape[0]): 
    plt.imshow(video[i,:,:]) 
    plt.pause(0.5) 
+0

これは私の場合のループの最後の画像を表示します – mcExchange

+1

これは機能しました!私は '%matplotlib qt'を追加して、Pythonプロットを外部のウィンドウにする必要がありました。また、この答えは爽やかでコンパクトです – mcExchange

0

video[t, x, y]に格納された画像のセットのために、これは単純なアニメーションを作ります。試してみてくださいhere

以下は動的正弦波を描く例です。

import numpy as np 

def redraw_fn(f, axes): 
    amp = float(f)/3000 
    f0 = 3 
    t = np.arange(0.0, 1.0, 0.001) 
    s = amp * np.sin(2 * np.pi * f0 * t) 
    if not redraw_fn.initialized: 
     redraw_fn.l, = axes.plot(t, s, lw=2, color='red') 
     redraw_fn.initialized = True 
    else: 
     redraw_fn.l.set_ydata(s) 

redraw_fn.initialized = False 

num_time_steps = 100 
videofig(num_time_steps, redraw_fn) 
関連する問題