我想在 matplotlib 中绘制一系列 .png 图像。目标是快速绘制它们以模拟电影的效果,但我还有其他原因想要避免实际创建 .avi 文件或保存 matplotlib 图形,然后在 Python 之外按顺序查看它们。
我特别尝试在 Python 的 for 循环内按顺序查看图像文件。假设我已经正确导入了 matplotlib,并且我有自己的函数“new_image()”和“new_rect()”,这里有一些示例代码由于 show() 函数调用 GUI 主循环的阻塞效应而无法工作:
for index in index_list:
img = new_image(index)
rect = new_rect(index)
plt.imshow(img)
plt.gca().add_patch(rect)
plt.show()
#I also tried pausing briefly and then closing, but this doesn't
#get executed due to the GUI mainloop from show()
time.sleep(0.25)
plt.close()
上面的代码只显示第一张图片,但随后程序挂起并等待我手动关闭生成的图形窗口。一旦我关闭它,程序就会挂起并且不会使用新的图像数据重新绘制。我应该做什么?另请注意,我尝试用 plt.draw() 命令替换 plt.show() 命令,然后在 for 循环之外添加 plt.show()。这不会显示任何内容,只是挂起。
最佳答案
基于 http://matplotlib.sourceforge.net/examples/animation/simple_anim_tkagg.html :
import time
import numpy as np
import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
def animate():
tstart = time.time() # for profiling
data=np.random.randn(10,10)
im=plt.imshow(data)
for i in np.arange(1,200):
data=np.random.randn(10,10)
im.set_data(data)
fig.canvas.draw() # redraw the canvas
print 'FPS:' , 200/(time.time()-tstart)
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()
plt.imshow
可以接受 float 组、uint8 数组或 PIL 图像。
因此,如果您有一个 PNG 文件目录,您可以将它们作为 PIL 图像打开并像这样制作动画:
import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
import Image
import glob
fig = plt.figure()
ax = fig.add_subplot(111)
def animate():
filenames=sorted(glob.glob('*.png'))
im=plt.imshow(Image.open(filenames[0]))
for filename in filenames[1:]:
image=Image.open(filename)
im.set_data(image)
fig.canvas.draw()
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()
关于python - 如何为按时间排序的 matplotlib 图序列制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686550/