使用matplotlib Python绘制一系列图像

时间:2012-03-26 19:09:43

标签: python graphics matplotlib cluster-analysis

我正在用Python实现kmeans聚类算法。我想在每次迭代时绘制群集质量的状态(图像)。所以,基本上我有一个循环,在每次迭代时绘制一个图像,我想要动画这个。我不知道我是否说清楚了。目前我只使用show()命令绘制图像,但我必须关闭它以继续迭代。

那么,有没有办法动画在每一步计算出的图像序列?

4 个答案:

答案 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)