我正在用Python实现kmeans聚类算法。我想在每次迭代时绘制群集质量的状态(图像)。所以,基本上我有一个循环,在每次迭代时绘制一个图像,我想要动画这个。我不知道我是否说清楚了。目前我只使用show()命令绘制图像,但我必须关闭它以继续迭代。
那么,有没有办法动画在每一步计算出的图像序列?
答案 0 :(得分: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 :(得分: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)
答案 2 :(得分:0)
只需启用交互模式:
ion()
show()
它会起作用。这有点奇怪。但请记住:在python脚本结束时,它将关闭窗口。你必须致电
ion()
show()
在脚本的末尾,如果你不想关闭窗口。
答案 3 :(得分: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)