matplotlib从起点出发(6)_Tutorial_6_Animations

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 * tv02 = 5
z2 = g * t**2 / 2 + v02 * tscat = 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]).Tscat.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.mzph.cn/news/15156.shtml

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

相关文章

php 服务器 http状态码为499的解决办法

原因:某些http请求服务端处理太慢,影响了其他http请求。 1.配置php.ini的max_execution_time和max_input_time。但是改后还是报了不少的499。 (set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如…

行为型设计模式之观察者模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

解决报错Avoid using non-primitive value as key, use string/number value instead.

找到图中画圈的文件这个错误信息的意思是要避免使用非基本值作为键&#xff0c;而是使用字符串/数字值代替。 [1] 这个错误通常出现在使用<el-select>中的<el-option>进行循环遍历值时。 [2] 这个错误的解决方案是检查是否有重复的键值&#xff0c;并确保使用字符…

【Python】aio Queue 的超时封装

一般封装生产者消费者模型的时候会用到 asyncio.Queue&#xff0c;queue 的 put 和 get 操作都是阻塞的&#xff08;当然可以通过 _nowait 方法改为非阻塞&#xff09;&#xff0c;取数据的时候如果没数据则会一直阻塞。下面通过计数的方法给 asyncio.Queue 添加超时操作&#…

从源码编译 tensorFlow ,启用CPU 指令加速

适合只有cpu,没有显卡的AI 玩家&#xff0c;初学者 问题&#xff1a;AVX AVX2 AVX_VNNI FMA 是什么? AVX、AVX2、AVX_VNNI 和 FMA 都是针对 Intel CPU 的特殊指令集&#xff08;instruction set&#xff09;&#xff0c;用于加速数值计算和向量化操作。这些指令集提供了高级…

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化&#xff0c;可实现数据库同步&#xff08;一主一从&#xff08;双机备份&#xff09;&#xff0c;一主多从&#xff08;总部数据库&#xff0c;工厂1&#xff0c;工厂2&#xff0c;工厂数据合并到总部数据&#xff09;&#xff09; sqlserver 启用数据库…

Flowable-服务-消息任务

文章目录 定义图形标记XML内容集成Rabbitmq引入pom包配置rabbitmq 操作界面 定义 Mq 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Mq 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要做Mq消息发送。 图形标记 由于 Mq 任务不是 BPM…

用CSS和HTML写一个水果库存静态页面

HTML代码&#xff1a; <!DOCTYPE html> <html> <head><link rel"stylesheet" type"text/css" href"styles.css"> </head> <body><header><h1>水果库存</h1></header><table>…

MFC图表控件high-speed-charting的使用

high-speed-charting是MFC上的开源图表库,Teechart的替代品。 high-speed-charting的下载地址 https://www.codeproject.com/Articles/14075/High-speed-Charting-Control 特性 High-speed drawing (when axis is fixed) which allows fast plotting of dataUnlimited number …

list与sort()

运行代码&#xff1a; //list与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istre…

【Golang 接口自动化01】使用标准库net/http发送Get请求

目录 发送Get请求 响应信息 拓展 资料获取方法 发送Get请求 使用Golang发送get请求很容易&#xff0c;我们还是使用http://httpbin.org作为服务端来进行演示。 package mainimport ("bytes""fmt""log""net/http""net/url&qu…

Shell 排序法 - 改良的插入排序

说明 插入排序法由未排序的后半部前端取出一个值&#xff0c;插入已排序前半部的适当位置&#xff0c;概念简单但速度不快。 排序要加快的基本原则之一&#xff0c;是让后一次的排序进行时&#xff0c;尽量利用前一次排序后的结果&#xff0c;以加快排序的速度&#xff0c;Shel…

ZLMediaKit+wvp-GB28181-pro 安装文档

文章目录 前言1. 安装zlm1.1 镜像说明1.2 docker安装1.2.1 docker安装命令1.2.2 docker-compose安装 1.3. zlm配置和日志重点说明 2. 安装wvp2.1 目录结构说明2.1.1 导入idea2.1.2 sql文件夹自带初始化库脚本2.1.3 进入web_src 编译静态资源2.1.4 修改resources配置 2.2 wvp 启…

DHCP中继代理原理(第二十八课)

当客户机和DHCP服务器不在一个广播域时,DHCP服务器无法接收到客户机的DHCP discover广播数据包,客户机就无法获得IP地址 第一步配置DHCP服务器的信息 <Huawei>u t m //清除日志 Info: Current terminal monitor is off. <Huawei>sys [Huawei]sysname DHCP-R…

分布式异步任务处理组件(二)

一些关键点的设计脑暴记录----very important&#xff01;&#xff01;&#xff01; 首先&#xff0c;任务存储交给kafka&#xff0c;由节点负责写入kafka&#xff0c;acks1&#xff1b;失败重试&#xff1b;透传kafka的提交可靠性&#xff0c;保证任务提交成功&#xff1b;后…

c语言locale.h简介

<locale.h>提供的函数用于控制c标准库中对于不同的地区行为不一样的部分。&#xff08;地区通常是国家或者某种特定语言的地理区域&#xff09; 在标准库里&#xff0c;依赖地区的部分通常包括以下几项&#xff1a; 数字量的格式 货币的格式 字符集 时间日期的格式 它设…

IOS开发:去除TabView的底部留白

我最近在做IOS开发的时候&#xff0c;使用SwiftUI中的TabView做左右滚动的页面切换&#xff0c;遇到了页面底部有大量留白无法去除的问题&#xff1a; 我查了很多资料都没有看到网上有人记录这个问题的解决方案&#xff0c;后来查阅apple developer的文档&#xff0c;我发现.ed…

iOS开发-字符串base64编码与解码

iOS开发-字符串base64编码与解码 在开发总经常遇到需要将字符串进行base64加密与解密。Base64是网络上最常见的用于传输8Bit字节码的编码方式之一&#xff0c;Base64就是一种基于64个可打印字符来表示二进制数据的方法。 这里使用的是GTMBase64 在Podfile中引入 pod GTMBas…