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

我在matplotlib.animation库中使用FuncAnimation遇到麻烦,因此我决定每次都渲染一个表面图,将表面图另存为.png文件,然后使用pyplot.imread读取该图像。 从那里,我想将每个图像存储到一个列表中,以便可以使用ArtistAnimation示例 )。 但是,它不是制作动画,而是当我在屏幕上打印imgplot时得到两个单独的空白图,然后得到我的表面图.png。

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

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()

===============>>#1 票数:4 已采纳

问题1:不显示图像

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

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

该要求是特定于animation并且与matplotlib其他绘图功能不一致,在matplotlib ,您通常可以不同地使用my_plot=plt.plot()plt.plot()

这个问题在这里进一步讨论。

问题2:保存不起作用

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

问题3:两个窗口

最后一个问题是弹出两个数字。 原因是当您调用plt.imshow() ,它将在当前图形上显示一个图像,但是由于尚未创建任何图形,因此pyplot会为您隐式创建一个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()

  ask by user3552736 translate from so

未解决问题?本站智能推荐:

关注微信公众号