2012-03-26 103 views
4

我正在Python中實現kmeans聚類算法。我想在每次迭代時繪製羣集質量的狀態(圖像)。所以,基本上我有一個循環,在每次迭代時都繪製一幅圖像,我想爲其製作動畫。我不知道我是否清楚。此刻我只是使用show()命令來繪製圖像,但是爲了繼續迭代,我必須關閉它。用matplotlib繪製一系列圖像Python

那麼,是否有某種方法來動畫在每個步驟計算的圖像序列?

回答

0

只啓用交互模式:

ion() 
show() 

,它會工作。這有點奇怪。但請記住:在Python腳本的末尾,它會關閉窗口。您必須致電

ion() 
show() 

在腳本末尾,如果您不希望窗口關閉。

4

我嘗試了ion()方法,它適用於少量的數據,但如果您有較大的圖像或圖像以相對較快的速度流動,此方法速度極慢。據我所知,ion()將重繪每一次你改變你的數字,包括軸和標籤等,這可能不是你想要的。

This thread顯示處事

的好得多的方式下面是一個簡單的例子,我做了展示如何做到這一點:

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我的機器上與上面的代碼。當我與plt.ion()ax.imshow(data)代替im.axes.figure.canvas.draw()im.set_data(data)運行同樣的事情,我避開1個FPS

1

使用pause()。對於存儲在video[t, x, y]一組圖像,這使得一個簡單的動畫:

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

這隻顯示了我的情況下循環的最後一張圖片 – mcExchange 2016-10-12 14:46:50

+1

現在它的工作原理!我不得不添加'%matplotlib qt'來使python繪圖到外部窗口中。此外,這個答案令人耳目一新 – mcExchange 2016-10-12 14:55:48

0

我已經實現的圖像序列的可視化工具,它可以是有幫助的。試試吧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)