我正在Python中實現kmeans聚類算法。我想在每次迭代時繪製羣集質量的狀態(圖像)。所以,基本上我有一個循環,在每次迭代時都繪製一幅圖像,我想爲其製作動畫。我不知道我是否清楚。此刻我只是使用show()命令來繪製圖像,但是爲了繼續迭代,我必須關閉它。用matplotlib繪製一系列圖像Python
那麼,是否有某種方法來動畫在每個步驟計算的圖像序列?
我正在Python中實現kmeans聚類算法。我想在每次迭代時繪製羣集質量的狀態(圖像)。所以,基本上我有一個循環,在每次迭代時都繪製一幅圖像,我想爲其製作動畫。我不知道我是否清楚。此刻我只是使用show()命令來繪製圖像,但是爲了繼續迭代,我必須關閉它。用matplotlib繪製一系列圖像Python
那麼,是否有某種方法來動畫在每個步驟計算的圖像序列?
只啓用交互模式:
ion()
show()
,它會工作。這有點奇怪。但請記住:在Python腳本的末尾,它會關閉窗口。您必須致電
ion()
show()
在腳本末尾,如果您不希望窗口關閉。
我嘗試了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
使用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)
我已經實現的圖像序列的可視化工具,它可以是有幫助的。試試吧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)
這隻顯示了我的情況下循環的最後一張圖片 – mcExchange 2016-10-12 14:46:50
現在它的工作原理!我不得不添加'%matplotlib qt'來使python繪圖到外部窗口中。此外,這個答案令人耳目一新 – mcExchange 2016-10-12 14:55:48