我正在Python中实现kmeans聚类算法。我希望在每次迭代时绘制集群质量的状态(图像)。基本上,我有一个循环,在每次迭代时绘制一张图像,我想要动画化这个过程。我不知道我是否表达清楚了。目前我只是使用show()命令绘制图像,但然后我必须关闭它才能继续迭代。
那么,有没有一些方法可以动态显示每个步骤计算出的图像序列?
那么,有没有一些方法可以动态显示每个步骤计算出的图像序列?
ion()
方法,对于小量数据效果很好,但是如果您有大量图像或者图像流速度比较快,这个方法会非常缓慢。据我所知,ion()
每次更改图形(包括轴和标签等)时都会重新绘制所有内容,这可能不是您想要的。
这个线程展示了更好的做法。
这里有一个我制作的简单示例展示如何实现:
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帧每秒的速度。当我使用plt.ion()
和ax.imshow(data)
代替im.axes.figure.canvas.draw()
和im.set_data(data)
运行相同的内容时,我只能获得大约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)
只需启用交互模式:
ion()
show()
它会起作用的。这有点奇怪。但请记住:在 Python 脚本的末尾,它将关闭窗口。您必须调用
ion()
show()
我已经实现了一个图像序列可视化工具,可能会很有帮助。你可以在这里试用一下。
下面是一个绘制动态正弦波的示例。
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)
%matplotlib qt
,以便将Python绘图显示在外部窗口中。此答案也令人耳目一新地简洁。 - mcExchange