如何把python绘制的动态图形保存为gif文件或视频
liuian 2025-03-12 16:44 12 浏览
使用Matplotlib中的matplotlib.animation 方法可以绘制更好看、更有吸引力的动画图形,那如何把这种动画图形保存为Gif动画文件或视频文件呢?本文简述与之相关的方法。把python程序中绘制的动画图形保存为视频格式或gif格式文件,以便播放或发送给其他人,或者插入找文档或网页中。本文分两部分,先介绍python程序绘制简单的动态图形或动画(也可阅读 《python 绘制动画图》这篇文章),然后再介绍如何把绘制的动态图形或动画保存为gif格式文件或视频文件。
先用 Matplotlib.animation 类中的函数 FuncAnimation 创建动态图和动画,如动态折线、柱状图动画,另外还需要使用 figure 函数和 animation 函数,这些都是python使用matplotlib绘制图形时常用的方法。
1. 创建动态折线图
1)绘制动态折线图,代码如下:
import random
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig = plt.figure(figsize=(15,15))
x,y = [], []
index= count()
def animate(i):
x.append(next(index))
y.append(random.randint(2,20))
plt.style.use("ggplot")
plt.plot(x,y)
ani = FuncAnimation(fig, animate, interval=300)
plt.show()
结果如图1:
主要代码行说明:
以上代码块中 “ani = FuncAnimation(fig, animate, interval=300)” 这一行中,FuncAnimation() 有三个参数:
1) fig,表示图形参数
指容纳plot图形的对象, 需要创建该对象,或者调用 matplotlib.pyplot.gcf() 函数 ,表示获得当前图形;
2) animate 自定义函数
这是 FuncAnimation 中的动画自定义函数, 要想获得动画图形就要把该参数设定为“animate”,图形就会根据数据持续更新,注意创建图形和数据更新缺一不可。
3) 画面间隔参数 interval
该参数指定画面的更新速度,单位是毫秒。interval=1000 表示该函数运行动画函数,并且每秒钟更新一次。
以上代码块中 “plt.style.use("ggplot")” 这一行,指定动画图形的风格为 “ggplot”,要想了解更多的图形风格,可使用以下代码:
import matplotlib.pyplot as plt
print(plt.style.available)
输入结果如下:
bmh
classic
dark_background
fast
fivethirtyeight
ggplot
grayscale
seaborn-bright
seaborn-colorblind
seaborn-dark-palette
seaborn-dark
seaborn-darkgrid
seaborn-deep
seaborn-muted
seaborn-notebook
seaborn-paper
seaborn-pastel
seaborn-poster
seaborn-talk
seaborn-ticks
seaborn-white
seaborn-whitegrid
seaborn
Solarize_Light2
tableau-colorblind10
_classic_test
上述代码块输出的图形结果中,两个数轴都是不固定的,这与 Matplotlib Axes Setting 有关,plot函数中也没有定义线的颜色。
2.创建动画图形
代码如下:
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
%matplotlib qt
fig = plt.figure(figsize=(6,4))
axes = fig.add_subplot(1,1,1)
plt.title("Dynamic Axes")
y1 = [random.randint(-10,10)+(i**1.6)/(random.randint(9,12)) for i in range(0,280,2)]
t = range(len(y1))
x,y=[], []
def animate(i):
x.append(t[i])
y.append((y1[i]))
plt.xlim(i-30,i+3)
axes.set_ylim(y1[i]-100, y1[i]+100)
plt.plot(x,y, scaley=True, scalex=True, color="red")
anim = FuncAnimation(fig, animate, interval=100)
输出结果如图2:
保存动态图形
保存Matplotlib绘制的动画可能会出现一些小故障。下面介绍一下常用的选项和参数,既可以节省保存动画所需的时间,又可以尽可能地减少故障;可以把python代码生成的动画保存为个人需要的格式,如gif、mp4、avi、mov等文件格式,这取决于保存时选择对应的参数。
- 保存为GIF文件--图1,代码如下:
f = r"d:\\animation.gif"
writergif = animation.PillowWriter(fps=30)
anim.save(f, writer=writergif)
这段代码中,常用的选项有 ImageMagick 和 PillowWriter。
对于windows 操作系统来说,使用 ImageMagick 方法一般要先安装相关程序包,并且在保存动画为 GIF 文件时,建议使用 Write Instance,还是比较复杂;如果是Unix操作系统,ImageMagick一般情况下都已经安装了,使用 ImageMagick 方法 就方便。因此,建议windows用户使用 PillowWriter 方法。
定义 gif 图形的帧数:
修改 FuncAnimation函数中的 save_count 参数的值,设定 GIF 文件的帧数,默认为 100 帧,代码如下:
anim = animation.FuncAnimation(figure, func=update_figure, fargs=(bar_rects, iteration), frames=generator, interval=100, repeat=True, save_count=1500)
示例代码中,把GIF文件的帧数修改为 1500 帧。
- 保存为视频文件
把调用matplotlib的方法生成的动画保存为视频文件,需要 ffmpeg.exe 安装程序,可到官网下载,如下图:
特别注意,安装后要把该运行程序的路径 ffmpeg\bin\ffmpeg.exe 添加到环境变量中,此路径一定要正确 并且一定是指向可执行文件,而不仅仅是该文件所在的文件夹。在生成动画的python程序块中要加入以下代码行:
import matplotlib as mpl
mpl.rcParams['animation.ffmpeg_path'] = r'C:\\Users\\xx\\Desktop\\ffmpeg\\bin\\ffmpeg.exe'
接下来,把 matplotlib 绘制的动画保存为 mp4 格式的视频文件,代码如下:
f = r"d:\\animation.mp4"
writervideo = animation.FFMpegWriter(fps=60)
anim.save(f, writer=writervideo)
定义视频的尺寸:
视频的尺寸就是用 matplotlib 工具包绘制图形的窗口大小,调整对应窗口的大小即刻,示例代码如下:
plt.subplots(figsize=(12,8))
(本文结束)
- 上一篇:Matplotlib后端
- 下一篇:使用Matplotlib可视化数据的5个强大技巧
相关推荐
- Optional是个好东西,如果用错了就太可惜了
-
原文出处:https://xie.infoq.cn/article/e3d1f0f4f095397c44812a5be我们都知道,在Java8新增了一个类-Optional,主要是用来解决程...
- IDEA建议:不要在字段上使用@Autowire了!
-
在使用IDEA写Spring相关的项目的时候,在字段上使用@Autowired注解时,总是会有一个波浪线提示:Fieldinjectionisnotrecommended.纳尼?我天天用,咋...
- Spring源码|Spring实例Bean的方法
-
Spring实例Bean的方法,在AbstractAutowireCapableBeanFactory中的protectedBeanWrappercreateBeanInstance(String...
- Spring技巧:深入研究Java 14和SpringBoot
-
在本期文章中,我们将介绍Java14中的新特性及其在构建基于SpringBoot的应用程序中的应用。开始,我们需要使用Java的最新版本,也是最棒的版本,Java14,它现在还没有发布。预计将于2...
- Java开发200+个学习知识路线-史上最全(框架篇)
-
1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...
- 年末将至,Java 开发者必须了解的 15 个Java 顶级开源项目
-
专注于Java领域优质技术,欢迎关注作者:SnailClimbStar的数量统计于2019-12-29。1.JavaGuideGuide哥大三开始维护的,目前算是纯Java类型项目中Sta...
- 字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验
-
最近各大厂都在开源自己的跨平台框架,前脚腾讯刚宣布计划四月开源基于Kotlin的跨平台框架「Kuikly」,后脚字节跳动旧开源了他们的跨平台框架「Lynx」,如果说Kuikly是一个面向...
- 我要狠狠的反驳“公司禁止使用Lombok”的观点
-
经常在其它各个地方在说公司禁止使用Lombok,我一直不明白为什么不让用,今天看到一篇文章列举了一下“缺点”,这里我只想狠狠地反驳,看到列举的理由我竟无言以对。原文如下:下面,结合我自己使用Lomb...
- SpringBoot Lombok使用详解:从入门到精通(注解最全)
-
一、Lombok概述与基础使用1.1Lombok是什么Lombok是一个Java库,它通过注解的方式自动生成Java代码(如getter、setter、toString等),从而减少样板代码的编写,...
- Java 8之后的那些新特性(六):记录类 Record Class
-
Java是一门面向对象的语言,而对于面向对象的语言中,一个众所周知的概念就是,对象是包含属性与行为的。比如HR系统中都会有雇员的概念,那雇员会有姓名,ID身份,性别等,这些我们称之为属性;而雇员同时肯...
- 为什么大厂要求安卓开发者掌握Kotlin和Jetpack?优雅草卓伊凡
-
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡一、Kotlin:Android开发的现代语言选择1.1Kotlin是什么?Kotlin是由...
- Kotlin这5招太绝了!码农秒变优雅艺术家!
-
Kotlin因其简洁性、空安全性和与Java的无缝互操作性而备受喜爱。虽然许多开发者熟悉协程、扩展函数和数据类等特性,但还有一些鲜为人知的特性可以让你的代码从仅仅能用变得真正优雅且异常简洁。让我们来看...
- 自行部署一款免费高颜值的IT资产管理系统-咖啡壶chemex
-
在运维时,ICT资产太多怎么办,还是用excel表格来管理?效率太低,也不好多人使用。在几个IT资产管理系统中选择比较中,最终在Snipe-IT和chemex间选择了chemex咖啡壶。Snip...
- PHP对接百度语音识别技术(php对接百度语音识别技术实验报告)
-
引言在目前的各种应用场景中,语音识别技术已经越来越常用,并且其应用场景正在不断扩大。百度提供的语音识别服务允许用户通过简单的接口调用,将语音内容转换为文本。本文将通过PHP语言集成百度的语音识别服务,...
- 知识付费系统功能全解析(知识付费项目怎么样)
-
开发知识付费系统需包含核心功能模块,确保内容变现、用户体验及运营管理需求。以下是完整功能架构:一、用户端功能注册登录:手机号/邮箱注册,第三方登录(微信、QQ)内容浏览:分类展示课程、文章、音频等付费...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)