matplotlib从起点出发(6)_Tutorial_6_Animations

news2024/9/29 3:35:50

1 在matplotlib中使用动画

基于其绘图功能,matplotlib还提供了一个使用动画模块生成动画animation的接口。动画是一系列帧,其中每个帧对应于图形Figure 上的一个绘图。本教程介绍了有关如何创建此类动画的一般准则以及可用的不同选项。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

2 动画类

matplotlib中的动画可以用2种不同的方式来思考:

  • FuncAnimation: 为首帧生成数据,然后在首帧数据的基础上为后续的每一帧进行修改,进而生成一组动图;
  • ArtistAnimation: 生成一列(可迭代的)artists,绘制每一帧,生成动图。

FuncAnimation在速度和内存方面更有效,因为它仅绘制artist一次,然后对其进行修改;另一方面,ArtistAnimation是灵活的,因为它允许任何可迭代的artist在一个序列中进行动画处理。

FuncAnimation

FuncAnimation类允许我们通过传递一个迭代修改绘图数据的函数来创建动画。这里通过在各种artist上使用setter方法来实现的(例如:Line2D、PathCollection等)。通常的FuncAnimation对象采用我们想要动画化的图形和修改绘制在图形上的数据的function函数。它使用帧参数来确定动画的长度。间隔参数用于确定绘制两帧之间的时间(以ms为单位)。使用FuncAnimation制作动画通常遵循以下结构:

  • 绘制初始图形,包括所有必需的artists,将所有artists保存在变量中,以便以后可以在动画过程中更新它们;
  • 创建一个动画函数,该函数更新每个artist中的数据,以便在每次函数调用时生成新帧;
  • 使用Figure和动画函数以及确定动画属性的关键字参数创建FuncAnimation对象;
  • 使用动画。Animation.savepyplot.show用于保存或显示动画。

更新函数使用set_*函数提供不同的artist修改数据。下表显示了几种打印方法、它们返回的artist类型以及可用于更新它们的一些方法。

Plotting methodArtistSet method
Axes.plotlines.Line2Dset_data
Axes.scattercollections.PathCollectionset_offsets
Axes.imshowimage.AxesImageAxesImage.set_data
Axes.annotatetext.Annotationupdate_positions
Axes.barhpatches.Rectangleset_angle,set_bounds,set_height,set_width,set_x,set_y,set_xy
Axes.fillpatches.Polygonset_xy
Axes.add_patch(patches.Ellipse)patches.Ellipseset_angle,set_center,set_height,set_width

涵盖所有类型的artist设置方法超过了本教程的范围,但可以在它们各自的文档中找到。用于Axes.scatterAxes.plot的此类更新方法的示例如下:

fig, ax = plt.subplots()
t = np.linspace(0, 3, 40)
g = -9.81
v0 = 12
z = g * t**2 / 2 + v0 * t

v02 = 5
z2 = g * t**2 / 2 + v02 * t

scat = ax.scatter(t[0], z[0], c="b", s=5, label=f'v0 = {v0} m/s')
line2 = ax.plot(t[0], z2[0], label=f'v0 = {v02} m/s')[0]
ax.set(xlim=[0, 3], ylim=[-4, 10], xlabel='Time [s]', ylabel='Z [m]')
ax.legend()


def update(frame):
    # 为每一帧,更新每一个artist对象中存储的数据.
    x = t[:frame]
    y = z[:frame]
    # 更新散点图scatter plot:
    data = np.stack([x, y]).T
    scat.set_offsets(data)
    # 更新曲线图line plot:
    line2.set_xdata(t[:frame])
    line2.set_ydata(z2[:frame])
    return (scat, line2)


ani = animation.FuncAnimation(fig=fig, func=update, frames=40, interval=30)
plt.show()

在这里插入图片描述

ArtistAnimation

如果存在存储在各种不同artist上的数据,则可以使用artist的列表逐帧转换为动画。例如,当我们使用Axes.barh绘制柱形图时,它会为每个柱形和误差柱创建许多的artist。要更新绘图,需要单独更新窗口中的每个柱形并重新绘制它们。相反,animation.artistAnimation可用于单独绘制每一帧,然后拼接在一起形成动画。柱形图竞赛就是一个简单的例子。

fig, ax = plt.subplots()
rng = np.random.default_rng(19680801)
data = np.array([20, 20, 20, 20])
x = np.array([1, 2, 3, 4])

artists = []
colors = ['tab:blue', 'tab:red', 'tab:green', 'tab:purple']
for i in range(20):
    data += rng.integers(low=0, high=10, size=data.shape)
    container = ax.barh(x, data, color=colors)
    artists.append(container)


ani = animation.ArtistAnimation(fig=fig, artists=artists, interval=400)
plt.show()

在这里插入图片描述

3 动图保存器

动画对象可以使用各种多媒体写入器(例如:Pillow, ffpmeg, imagemagick)保存到磁盘。并非所有编写器都支持所有视频格式。有4种主要类型的artist:

  • PillowWriter - 使用Pillow库创建动图;
  • HTMLWriter- 使用基于JavaScript的动图;
  • 基于管道的编写器 - FFMpegWriterImageMagickWriter是基于管道的编写器。这些编写器将每个帧通过管道传输到实用程序(ffmpeg/imagemagick),然后将它们全部拼接在一起以创建动画;
  • 基于文件的编写器 - FFMpegFileWriterImageMagickFileWriter是基于文件的编写器的示例。这些编写器比基于管道的替代方法慢,但对于调试更有用,因为它们在将它们拼接成动画之前将每个帧保存在文件中。

保存动图

WriterSupportedFormats
PillowWriter.gif, .apng, .webp
HTMLWriter.htm, .html, .png
FFMpegWriter, FFMpegFileWriter所有ffmpeg支持的格式:ffmpeg -formats
ImageMagickWriter, ImageMagickFileWriter所有imagemagick支持的格式:magick -list format

要采用任何编写器保存动画,我们可以使用animation.Animation.save 方法。它采用我们要保存动画的文件名和编写器,该编写器可以是字符串或编写器对象。它还需要一个fps参数。此参数不同于FuncAnimationArtistAnimation使用的区间参数。FPS确定保存的动画使用的帧速率,而间隔确定显示的动画使用的帧速率。

下面是一些示例,演示如何使用不同的编写器保存动画。

Pillow 写入器

ani.save(filename="/tmp/pillow_example.gif", writer="pillow")
ani.save(filename="/tmp/pillow_example.apng", writer="pillow")

HTML 写入器

ani.save(filename="/tmp/html_example.html", writer="html")
ani.save(filename="/tmp/html_example.htm", writer="html")
ani.save(filename="/tmp/html_example.png", writer="html")

FFMpegWriter

ani.save(filename="/tmp/ffmpeg_example.mkv", writer="ffmpeg")
ani.save(filename="/tmp/ffmpeg_example.mp4", writer="ffmpeg")
ani.save(filename="/tmp/ffmpeg_example.mjpeg", writer="ffmpeg")

Imagemagick 写入器

ani.save(filename="/tmp/imagemagick_example.gif", writer="imagemagick")
ani.save(filename="/tmp/imagemagick_example.webp", writer="imagemagick")
ani.save(filename="apng:/tmp/imagemagick_example.apng",
         writer="imagemagick", extra_args=["-quality", "100"])

(apng的extra_args需要减小文件大小~10X).

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/808438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu23.04 flush DNS caches

如何在Ubuntu 23.04中刷新DNS缓存 现在,如果你运行的是Ubuntu 23.04,"系统解决 "的方法将不再适用于你。让我们检查一下你目前的缓存大小。打开你的Ubuntu终端,运行以下command: resolvectl statistics现在&#xff0c…

Android NDK开发

工程目录图 NDK中文官网 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 代码:TestNDK 参考文献 Android NDK 从入门到精通(汇总篇)Android JNI(一)——NDK与JNI基础Android之…

宝塔面板Django项目部署(无数据库版)

近日在学习使用宝塔面板部署Django开发的web项目,走了不少弯路花了3天的时间才完成下面的文字,希望这篇文字能给正在摸索中的人带去点帮助。 一、安装宝塔面板 打开宝塔面板的官方网站(https://www.bt.cn/new/index.html).点击" " 会看到: 当…

C++笔记之vector的reserve()和capacity()用法

C笔记之vector的reserve()和capacity()用法 code review! 代码 #include <vector> #include <iostream>int main() {std::vector<int> myVector;std::cout << "Current size: " << myVector.size() << std::endl;std::cout …

记录每日LeetCode 141.环形链表 Java实现

题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…

生成模型和判别模型工作原理介绍

您解决的大多数机器学习和深度学习问题都是从生成模型和判别模型中概念化的。在机器学习中,人们可以清楚地区分两种建模类型: 将图像分类为狗或猫属于判别性建模生成逼真的狗或猫图像是一个生成建模问题神经网络被采用得越多,生成域和判别域就增长得越多。要理解基于这些模型…

【雕爷学编程】MicroPython动手做(12)——掌控板之Hello World 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

如何用电脑同时管理多个微信号,实现多个微信聚合聊天?

我们知道&#xff0c;当使用电脑端微信时&#xff0c;只需要按住enter键并快速点击微信图标&#xff0c;就可以实现微信多开。 缺点&#xff1a;登录微信的数量不好控制&#xff0c;跳出的登录对话框过多需要手动关闭&#xff0c;而且管理起来非常麻烦&#xff01; 那么&#…

SpringSecurity的实现

SpringSecurity的实现 1.依赖 security起步依赖 redis起步依赖 fastjson jjwt生成token mybatis-plus起步依赖 mysql连接 web起步 test起步 <!-- security启动器 --><dependency><groupId>org.springframework.boot</groupId><arti…

万年历【小游戏】(Java课设)

系统类型 Java实现的小游戏 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 更多Java课设系统源码地址&#xff1a;更多Java课设系统源码地址 更多Java小游戏运行效果展示&#xff1a;更多Java小游戏运行效果展…

Harris角点检测步骤

Harris角点检测步骤

【MySQL】事务之MVCC(多版本并发控制)

【MySQL】事务-MVCC 一、数据库并发的三种场景二、MVCC2.1 3个记录隐藏字段2.2 undo log&#xff08;撤销日志&#xff09;2.3 模拟MVCC---update2.3.1 delete2.3.2 insert2.3.3 select 2.4 Read View2.5 整体流程 三、RR&#xff08;可重复读&#xff09;与RC&#xff08;读提…

Linux之Shell 编程详解(二)

第 9 章 正则表达式入门 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文 本编辑器里&#xff0c;正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中&#xff0c;grep&#xff0c; sed&#xff0c;awk 等文本处理工具都支持…

敏捷项目经理和传统项目经理有哪些区别?

敏捷项目经理和传统项目管理有哪些区别&#xff0c;经常有咱们群里的伙伴们问&#xff0c;敏捷项目经理注重迅速响应需求变化、灵活应变&#xff0c;而传统项目经理更为注重计划的制定与执行。作为项目经理&#xff0c;敏捷也是必要的技能&#xff0c;今天就为大家分享一下敏捷…

LeetCode刷题总结 - 面试经典 150 题 -持续更新

LeetCode刷题总结 - 面试经典 150 题 - 持续更新 其他系列数组 / 字符串88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II169. 多数元素189. 轮转数组121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II55. 跳跃游戏274. H 指数380.…

【Unity2D】角色动画的切换

动画状态转换 第一种方法是设置一个中间状态&#xff0c;从中间状态向其余各种状态切换&#xff0c;且各状态向其他状态需要设置参数 实现动作转移时右键点击Make Transition即可 实现动画转移需要设置条件 点击一种动画到另一种动画的线 &#xff0c;然后点击加号添加Condi…

SFP6012-ASEMI代理海矽美(MHCHXM)快恢复二极管

编辑&#xff1a;ll SFP6012-ASEMI代理海矽美&#xff08;MHCHXM&#xff09;快恢复二极管 型号&#xff1a;SFP6012 品牌&#xff1a;ASEMI 芯片个数&#xff1a;2 芯片尺寸&#xff1a;102MIL*2 封装&#xff1a;TO-247AB 恢复时间&#xff1a;75ns 工作温度&#xf…

4H-SiC nMOSFETs的亚阈值漏电流扫描滞后特性

目录 标题&#xff1a;On the Subthreshold Drain Current Sweep Hysteresis of 4H-SiC nMOSFETs研究了什么文章创新点文章的研究方法文章得出的结论 标题&#xff1a;On the Subthreshold Drain Current Sweep Hysteresis of 4H-SiC nMOSFETs 亚阈值滞后&#xff08;Subthresh…

python的包管理器pip安装经常失败的解决办法:修改pip镜像源

pip 常用的国内镜像源&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/ // 清华 http://mirrors.aliyun.com/pypi/simple/ // 阿里云 https://pypi.mirrors.ustc.edu.cn/simple/ // 中国科技大学 http://pypi.hustunique.com/ // 华中理…

Flowable-任务-脚本任务

定义 脚本任务&#xff08;Script Task&#xff09;是一种自动执行的活动。当流程执行到达脚本任务时&#xff0c;会执行相应的 脚本&#xff0c;完毕后继续执行后继路线。脚本任务无须人为参与&#xff0c;可以通过定义脚本实现自定义的业务逻辑。 图形标记 脚本任务显示为…