python – 使用ArtistAnimation在matplotlib中制作动画
|
我一直在尝试使用有限元方法为2D热流问题创建一系列表面图.在每个时间步,我保存了一个图而不是整个矩阵,以便更有效率.
我在matplotlib.animation库中遇到了FuncAnimation问题,因此我决定每次渲染一个曲面图,将曲面图保存为.png文件,然后使用pyplot.imread读取该图像.从那里,我想将每个图像存储到一个列表中,以便我可以使用ArtistAnimation(example).然而,它不是制作动画,而是当我将imgplot打印到屏幕时,我得到两个单独的空白图,然后是我的表面图.pngs. 此外,当我尝试保存动画时,我收到以下错误消息: AttributeError: 'module' object has no attribute 'save'. 任何帮助从当前目录中读取一组.pngs,将它们保存在列表中,然后使用ArtistAnimation“动画”那些.pngs将非常感激.我不需要任何花哨的东西. (注意 – 我必须使代码自动化,所以不幸的是我不能使用外部源来动画我的图像,如iMovie或ffmpeg.) 以下是我的代码: from numpy import *
from pylab import *
import matplotlib.pyplot as plt
import matplotlib.image as mgimg
from matplotlib import animation
## Read in graphs
p = 0
myimages = []
for k in range(1,len(params.t)):
fname = "heatflow%03d.png" %p
# read in pictures
img = mgimg.imread(fname)
imgplot = plt.imshow(img)
myimages.append([imgplot])
p += 1
## Make animation
fig = plt.figure()
animation.ArtistAnimation(fig,myimages,interval=20,blit=True,repeat_delay=1000)
animation.save("animation.mp4",fps = 30)
plt.show()
解决方法
问题1:不显示图像
您需要将动画对象存储在变量中: my_anim = animation.ArtistAnimation(fig,interval=100) 此要求特定于动画,并且与matplotlib中的其他绘图函数不一致,在matplotlib中,您通常可以无差别地使用my_plot = plt.plot()或plt.plot(). 这个问题将在here进一步讨论. 问题2:保存不起作用 没有任何动画实例,也无法保存图形.这是因为save方法 问题3:两个窗口 最后一个问题是你会弹出两个数字.原因是当你调用plt.imshow()时,它会在当前图形上显示一个图像,但由于还没有创建图形,pyplot会隐式为你创建一个图形. 这是修改后的代码: import matplotlib.pyplot as plt
import matplotlib.image as mgimg
from matplotlib import animation
fig = plt.figure()
# initiate an empty list of "plotted" images
myimages = []
#loops through available png:s
for p in range(1,4):
## Read in picture
fname = "heatflow%03d.png" %p
img = mgimg.imread(fname)
imgplot = plt.imshow(img)
# append AxesImage object to the list
myimages.append([imgplot])
## create an instance of animation
my_anim = animation.ArtistAnimation(fig,interval=1000,repeat_delay=1000)
## NB: The 'save' method here belongs to the object you created above
#my_anim.save("animation.mp4")
## Showtime!
plt.show()
(要运行上面的代码,只需将3个图像添加到工作文件夹中,名称为“heatflow001.png”,通过“heatflow003.png”.) 使用FuncAnimation的替代方法 当你第一次尝试使用FuncAnimation时,你可能是对的,因为在列表中收集图像在内存方面是昂贵的.我通过比较上面的内存使用情况来测试下面的代码与上面的代码 这是第二个代码: from matplotlib import pyplot as plt
from matplotlib import animation
import matplotlib.image as mgimg
import numpy as np
#set up the figure
fig = plt.figure()
ax = plt.gca()
#initialization of animation,plot array of zeros
def init():
imobj.set_data(np.zeros((100,100)))
return imobj,def animate(i):
## Read in picture
fname = "heatflow%03d.png" % i
## here I use [-1::-1],to invert the array
# IOtherwise it plots up-side down
img = mgimg.imread(fname)[-1::-1]
imobj.set_data(img)
return imobj,## create an AxesImage object
imobj = ax.imshow( np.zeros((100,100)),origin='lower',alpha=1.0,zorder=1,aspect=1 )
anim = animation.FuncAnimation(fig,animate,init_func=init,repeat = True,frames=range(1,4),interval=200,repeat_delay=1000)
plt.show()
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
