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 * 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).

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握Python的X篇_16_list的切片、len和in操作

接上篇掌握Python的X篇_15_list容器的基本使用,本篇进行进一步的介绍。 文章目录 1. list的索引下标可以是负数2. 切片(slice)2.1 切片基础知识2.2 如何“取到尽头”2.3 按照步长取元素2.4 逆序取值 3. len函数获取lis的元素个数4. in操作符…

自动驾驶感知系统--惯性导航定位系统

惯性导航定位 惯性是所有质量体本身的基本属性,所以建立在牛顿定律基础上的惯性导航系统(Inertial Navigation System,INS)(简称惯导系统)不与外界发生任何光电联系,仅靠系统本身就能对车辆进行连续的三维定位和三维定向。卫星导…

【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别、安卓APP和PC端QT客户端远程操控)有视频功能展示

目录 一、功能需求 二、开发环境 1、硬件: 2、软件: 3、引脚分配: 三、关键点 1、设计模式之工厂模式 2、wiringPi库下的相关硬件操作函数调用 3、语音模块的串口通信 4、线程 5、摄像头的实时监控和拍照功能 6、人脸识别 四、编…

Python web实战 | 使用 Django 搭建 Web 应用程序 【干货】

概要 从社交媒体到在线购物,从在线银行到在线医疗,Web 应用程序为人们提供了方便快捷的服务。Web 应用程序已经成为了人们日常生活中不可或缺的一部分。搭建一个高效、稳定、易用的 Web 应用程序并不是一件容易的事情。本文将介绍如何使用 Django 快速搭…

Python基础入门教程(上)

目录 一、你好Python 1.1、Python安装 win版 Linux版 1.2、第一个Python程序 二、Python基本语法 2.1、字面量 2.2、注释 2.3、变量 2.4、数据类型 type()函数 字符串类型的不同定义方式 2.5、数据类型转换 ​编辑 2.6、标识符 2.7、运算符 2.8、字符串扩展 …

Linux安装kafka3.5.1

要在Ubuntu上安装Apache Kafka,请按照以下步骤操作: 1、安装Java运行时环境(Ubuntu): 如果已经安装jdk不用执行 sudo apt update sudo apt install default-jre2、下载Kafka: wget https://downloads.apache.org/kafka/3.5.1/…

【【51单片机的红外遥控】】

红外遥控,完全把控 红外遥控 利用红外光进行通信的设备,由红外LED将调制后的信号发出,再由专门的红外接收头进行解调输出 通信方式:单工 异步 红外LED波长:940nm 通信协议标准:NEC标准 用那种一体化红红外…

下级平台级联视频汇聚融合平台EasyCVR,层级显示不正确的原因排查

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…

如何使用 After Effects 导出摄像机跟踪数据到 3ds Max

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中,我将展示如何在After Effects中跟踪实景场景,然后将相机数据导出到3ds Max。 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合…

Rust vs Go:常用语法对比(十二)

题图来自 Rust vs Go in 2023[1] 221. Remove all non-digits characters Create string t from string s, keeping only digit characters 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 删除所有非数字字符 package mainimport ( "fmt" "regexp")func main() { s : hei…

运行时数据区

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 类文件被类装载器加载之后,类中的内容(比如:变量、常量、方法、对象等)这些数据需要存储起来,存储的位置就是在 …

RabbitMQ 教程 | 客户端开发向导

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中,初步阐述了JMeter beanshell的使用,接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注:示例使用JMeter版本为5.1 1. vars 如 API 文档 所言,这是定义变量的类&a…

【点云处理教程】04 Python 中的点云过滤

一、说明 这是我的“点云处理”教程的第 4 篇文章。“点云处理”教程对初学者友好,我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在本教程中,我们将学习如何使用 Open3D 在 python 中过滤点云以进行下采样和异常值去除。使用 Open…

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集 前言相关介绍COCO格式实例分割数据集转换为YOLO格式实例分割数据集coco格式对应的json文件,以test.json为例格式转换代码,内容如下 前言 由于本人水平有限,难免出现错漏&#xf…

【JAVASE】什么是方法

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 方法 1. 方法概念及使用1.1 什么是方法1…

Vue『卡片拖拽式课程表』

Vue『卡片拖拽式课程表』 概述 在本篇技术博客中,我们将介绍一个使用Vue实现的『卡片拖拽式课程表』。这个课程表允许用户通过拖拽课程卡片来安排不同的课程在时间表上的位置。我们将逐步讲解代码实现,包括课程表的布局、拖拽功能的实现,以…

6G内存运行Llama2-Chinese-7B-chat模型

6G内存运行Llama2-Chinese-7B-chat模型 Llama2-Chinese中文社区 第一步: 从huggingface下载 Llama2-Chinese-7b-Chat-GGML模型放到本地的某一目录。 第二步: 执行python程序 git clone https://github.com/Rayrtfr/llama2-webui.gitcd llama2-web…

QtC++ 技术分析3 - IOStream

目录 iostreamscanf/printfiostream 整体架构流相关类流缓冲区 模板特化后整体结构文件流文件流对象创建常见文件流操作输出格式设定文件流状态 字符串流字符串流内部缓冲区字符串流使用 流缓冲区用户自定义 IO iostream scanf/printf 几种常见的输入输出流函数 scanf 从键盘…

操作系统4

文件管理 文件的逻辑结构 文件的目录 文件的物理结构 文件存储空间管理 文件的基本操作