使用 ArtistAnimation 在 matplotlib 中对 png 进行动画处理

2023-11-25

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

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

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

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)

此要求专门针对animation并且与其他绘图功能不一致matplotlib,通常可以使用的地方my_plot=plt.plot() or plt.plot()漠然地。

这个问题有待进一步讨论here.

问题2:保存不起作用

没有任何animation例如,也无法保存图形。这是因为save方法 属于ArtistAnimation班级。你所做的就是在呼唤save来自animation模块,这就是引发错误的原因。

问题 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ArtistAnimation 在 matplotlib 中对 png 进行动画处理 的相关文章

随机推荐

  • 通过曲面细分着色器将数据传递到片段着色器

    我对着色器管道在每个阶段传递数据方面的工作原理感到有点困惑 我想做的是传递在顶点阶段加载的颜色数据glVertexAttrib4fv 通过曲面细分控制着色器 然后是曲面细分评估着色器 这样就可以在片段着色器中使用 我不确定我是否犯了某种概念
  • 使用python输出到两个不同的控制台

    我正在编写一个脚本 并且有两种不同类型的输出 例如 Op1 和 Op2 我想将 Op1 输出到调用 python 进程的终端 而 Op2 应该转储到不同的终端实例 我可以这样做吗 即使答案是特定于 Linux 的也没关系 我需要一个临时解决
  • 为什么 document.getElementsBy__ 方法不返回 HTMLCollection?

    为什么不getElementsByName getElementsByTagName and getElementsByClassName返回一个HTMLCollection W3C MDN 代替NodeList W3C MDN 所有这三个
  • 什么是 org.eclipse.wst.common.component 以及如何将它用于 ant

    我有一个 Eclipse 工作区 用于工作 其中有一个 Ear 项目 我用它来 导出 将 Ear 文件部署到 JBoss 服务器 然而 他们最近要求我创建一个可以构建工作区并创建耳朵的 Ant 脚本 我已经成功地完成了这一点 当我尝试使用使
  • 带有Rails ajax的pushState

    我有一个索引操作页面 显示了用 Kaminari 分页的项目列表 我已经向它们添加了 ajax 功能 现在正在尝试使用 PushState 来获取适合的 URL 我的问题是 当我的分页链接通过以下方式完成时 如何获取传递给 PushStat
  • Gson 可选字段和必填字段

    一个人应该如何应对Gson必填字段与可选字段 由于所有字段都是可选的 因此我无法根据响应 json 是否包含某个键来真正使我的网络请求失败 Gson将简单地将其解析为 null 我正在使用的方法gson fromJson json mCla
  • 增加具有不同线程数的 2 个交替 OpenMP 并行区域的内存消耗

    当我重复在具有不同线程数的 2 个 OpenMP 并行区域之间交替时 内存消耗无限增加 数十 MB 甚至更多 即使在如此简单的代码片段中它也能做到这一点 include
  • 轮盘赌选择算法[重复]

    这个问题在这里已经有答案了 谁能提供一些轮盘赌选择函数的伪代码 我将如何实现这个 我真的不明白如何阅读这个数学符号 我想要通用算法 其他答案似乎假设您正在尝试实现轮盘赌游戏 我认为您问的是进化算法中的轮盘赌选择 这是一些Java代码实现轮盘
  • 如何在 Elixir 中重写 Erlang 组合算法?

    过去几周我一直在修补 Elixir 我刚刚遇到这个简洁的Erlang 中的组合算法 我尝试在 Elixir 中重写但卡住了 艾尔兰版本 comb 0 gt comb gt comb N H T gt H L L lt comb N 1 T
  • 在 Android 应用程序中显示日历

    如果有人能为我提供一个关于使用哪个组件的解决方案 以便我可以在我的 Android 应用程序中显示一个相当漂亮的日历 我将不胜感激 这两天我一直在寻找解决方案 但不幸的是找不到解决方案 由于这是一个非常基本的要求 我相信会有一个完美的解决方
  • C/C++ 编译器可以通过 pthread 库调用合法地将变量缓存在寄存器中吗?

    假设我们有以下代码 include
  • 为 PL/pgSQL 中实现的函数设置配置参数

    我在 PL pgSQL 中编写了几个函数 我想通过一些配置条目来控制它们的行为 这些配置条目也可以在运行时更改 每个会话 是否可以在中定义新的自定义配置条目postgresql conf 如果没有 解决办法是什么 作为我的搜索结果 我发现了
  • Python 多重处理 >= 125 列表永远不会完成

    我正在尝试实现这个多处理tutorial为了我自己的目的 起初我认为它的扩展性不好 但是当我做了一个可重现的示例时 我发现如果项目列表超过 124 它似乎永远不会返回答案 在x 124它在 0 4 秒内运行 但是当我将其设置为x 125它永
  • Python简单的音频生成器

    寻找一些 简单的 Python 音调生成器 用于在带有 USB 声卡的 raspi 上运行的以下脚本 需要动态音调开 关和频率改变 import serial time ser serial Serial dev ttyUSB0 9600
  • 使用 ggplot2 将 x 轴和 y 轴居中

    有没有办法像传统的图形计算器一样获取坐标轴 并将标签放在 ggplot2 图的中心 我浏览了文档 似乎没有这个功能 但其他绘图包不像 ggplot2 那样可以进行图形定制 为了澄清一下 我希望从这样的事情开始 To this 第一个图是用以
  • 如何在ios中获取twitter个人资料图片?

    我写了以下代码 NSURL url NSURL URLWithString http api twitter com 1 1 users show json NSDictionary params NSDictionary dictiona
  • ComboBox 下拉时如何捕获鼠标?

    我正在尝试对 ComboBox 下拉菜单 或与此相关的其他下拉菜单 包括上下文菜单 的行为进行建模 其中当您单击其他任何位置 甚至无法聚焦的内容 时 下拉菜单会关闭 我尝试过订阅 MouseCaptureChanged LostFocus
  • sed 替换部分字符串

    我想使用 sed 执行以下操作 case 1 here is some random text constant randomValue some more random text 我想在constant 之后直接替换randomvalue
  • 尝试从内部 Zip 文件(另一个 Zip 中的 Zip)获取流时出现“无法将其读取为 Zip 文件”异常

    在 C 中 我使用的是点网压缩我有一个名为 innerZip zip 的 zip 其中包含一些数据 另一个名为 outerZip zip 的 zip 包含了 innerZip 我为什么要这样做 好吧 在设置密码时 密码实际上适用于添加到存档
  • 使用 ArtistAnimation 在 matplotlib 中对 png 进行动画处理

    我一直在尝试使用有限元方法为二维热流问题创建一系列曲面图的动画 在每个时间步 我保存一个图而不是整个矩阵 以便更加高效 我遇到了麻烦FuncAnimation在 matplotlib animation 库中 所以我决定每次渲染一个曲面图