gpt4 book ai didi

python - 使用 ArtistAnimation 在 matplotlib 中动画化 png

转载 作者:太空狗 更新时间:2023-10-30 01:15:14 25 4
gpt4 key购买 nike

我一直在尝试使用有限元方法为我为二维热流问题创建的一系列曲面图制作动画。在每个时间步,我都保存了一个图而不是整个矩阵,以提高效率。

我在使用 matplotlib.animation 库中的 FuncAnimation 时遇到了问题,所以我决定每次都渲染一个表面图,将表面图保存为 .png 文件,然后读取该图像使用 pyplot.imread。从那里,我想将每个图像存储到一个列表中,以便我可以使用 ArtistAnimation (example)。然而,它并没有制作动画,而是在我将 imgplot 打印到屏幕上时,我得到了两个单独的空白图,然后是我的表面图 .pngs。

此外,当我尝试保存动画时,出现以下错误消息:

AttributeError: 'module' object has no attribute 'save'.

对于从当前目录读取一组 .png,将它们保存在列表中,然后使用 ArtistAnimation 为这些 .png“制作动画”的任何帮助,我们将不胜感激。我不需要任何花哨的东西。

(注意 - 我必须使代码自动化,所以不幸的是我不能使用外部源来为我的图像制作动画,如 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()

最佳答案

问题一:图片不显示

您需要将动画对象存储在一个变量中:

my_anim = animation.ArtistAnimation(fig, myimages, interval=100)

此要求特定于动画,与matplotlib 中的其他绘图功能不一致,您通常可以在其中使用my_plot=plt.plot()plt.plot() 无所谓。

这个问题进一步讨论here .

问题 2:保存不起作用

如果没有任何animation 实例,也无法保存图形。这是因为 save 方法属于 ArtistAnimation 类。您所做的是从 animation 模块调用 save,这就是引发错误的原因。

问题 3:两个窗口

最后一个问题是您会弹出两个数字。原因是当您调用 plt.imshow() 时,它会在当前图形上显示图像,但由于尚未创建图形,因此 pyplot 隐式创建一个你。当 python 稍后解释 fig = plt.figure() 语句时,它会创建一个新图形(另一个窗口)并将其标记为“图 2”。将此语句移至代码开头即可解决该问题。

修改后的代码:

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, myimages, interval=1000, blit=True, 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 时,您可能是对的,因为在列表中收集图像会占用大量内存。我通过比较内存使用情况来测试下面的代码和上面的代码系统监视器。 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, blit=True, repeat_delay=1000)

plt.show()

关于python - 使用 ArtistAnimation 在 matplotlib 中动画化 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com