如何通过 Matplotlib 绘制动画及保存 GIF 图片?
在自学机器学习或者是深度学习的过程中,有的时候总想把执行过程或者执行结果显示出来,所以就想到了动画。好在用 Python 实现动画有许多中方式,而大家熟知的 Matplotlib 库就可以实现。
本文的目的是对 Matplotlib 的动画实现手段做一个简单的说明。
绘制动画
import matplotlib.pyplot as plt
import matplotlib.animation as animation
如果要让 matplotlib 实现动画功能的话,那么就要引入 animation 模块。
然后再创建 animation 的对象。
anim = animation.FuncAnimation(fig, run, data_gen, blit=False, interval=10,repeat=False, init_func=init)
animation 的实现类是 FuncAnimation,它有一个构造方法。下面先通过一个示例,讲解 animation 的基本用法,然后再来细致分析 FuncAnimation 构造方法中各项参数的意义。
我们的目标是做一个 Sin 函数的动画示例。
代码很简单。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animationfig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro',animated=True)def init():ax.set_xlim(-np.pi,np.pi)ax.set_ylim(-1, 1)return ln,def update(frame):xdata.append(frame)ydata.append(np.sin(frame))ln.set_data(xdata, ydata)return ln,anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 90),interval=10,init_func=init,blit=True)
plt.show()
核心代码是这一行。
anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 90),interval=10,init_func=init,blit=True)
按照上面的示例代码,我们可以依葫芦画瓢编写动画代码了。
但,如果我们需要达到灵活运用的话,就需要花点心思,了解它们的机制。
我们先来看看 FuncAnimation 的构造方法。
def __init__(self, fig, func, frames=None, init_func=None, fargs=None,save_count=None, **kwargs):
fig 自然是 matplotlib 中的 figure 对象。
func 是每一次更新时所调用的方法,它是回调函数。因此,我们可以在这个方法中更新 figure 当中的 axes 中的 line2d 对象,它是动态更新 figure 的根本。
frames 代表了整个动画过程中帧的取值范围,而本质上是一个数据发生器。我将在后面重点讲解它。
init_func 是初始函数,用来初始 figure 的画面。
fargs 是每次附加给 func 回调函数的参数,可以为 None
save_count 是缓存的数量
除此之外,还有一些可选的参数,它们分别是
interval 是每 2 个 frame 发生的时间间隔,单位是 ms,默认值是 200.
repeat_delay 取值是数值,如果 animation 是重复播放的话,这个值就是每次播放之间的延迟时间,单位是 ms。
repeat bool 型可选参数,默认为 True,代表动画是否会重复执行
blit bool 型可选参数,控制绘制的优化。默认是 False。
如何理解 animation 呢?
我认为,animation 的核心是 frames 和 func。
frames 可以取值:iterable,int,generator 生成器函数 或者是 None。
在上面的代码中,我们给 frames 的取值是这样的。
frames=np.linspace(-np.pi,np.pi, 90)
其实就是一个 list,它的值范围为 -pi 到 pi,frames 总共有 90 帧,而 list 是一个 iterable 类型,所以它可以不停的迭代。
frames 也可以取值为整数,相当于给参数赋值 range(frames)。
frames 也可以取值为 None,那么它的结果相当于传递 itertools.count,结构就是从 0 开始,每次步进 1,无限的执行下去。
frames 还接受 generator 函数,也就是生成器,但有个前提是,生成器要符合下面的签名格式。
def gen_function() -> obj
参数列表为空,但需要返回一个值,这个值就会传入到 func 回调函数当中。
func 是回调函数,它会在每次更新的时候被调用,所以我们只需要在这个函数中更新 figure 中的数值就可以了,就像下面代码。
def update(frame):xdata.append(frame)ydata.append(np.sin(frame))ln.set_data(xdata, ydata)return ln,
frames 和 func 的关系是什么?
实际上,frames 决定了整个动画 frame 的取值范围,它会在 interval 时间内迭代一次,然后将值传递给 func,直到整个 frames 迭代完毕。
我本人而言,也更倾向于用 generator 函数去定义 frames 而不是直接分配一个列表,所以我可以将之前的代码改写如下。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animationfig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro',animated=True)def init():ax.set_xlim(-np.pi,np.pi)ax.set_ylim(-1, 1)return ln,def update(frame):xdata.append(frame)ydata.append(np.sin(frame))ln.set_data(xdata, ydata)return ln,def data_gen():frame = -np.pistep = 2 * np.pi / 90while frame < np.pi:frame += stepyield frame# anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 360),interval=10,
# init_func=init,blit=True)
anim = animation.FuncAnimation(fig, update, frames=data_gen,interval=10,init_func=init,blit=True)plt.show()
data_gen 就是一个生成器函数,它会每隔 10ms 运行一次,然后将结果传递给 update 函数。
data_gen 里面运用到了 yield 关键字,这是的我们可以在每次迭代时才返回相应的结构,而不要在一开始就分配。如果不熟悉这方面知识点的同学,可以自行搜索相应的知识。
保存动画
因为经常写博客,所以也经常需要将结果保存下来,一般我会保存为 .gif 格式图片,本篇博文的 gif 图像就是通过 matplotlib 保存的。
好在用 matplotlib 实现它也并不难。
anim.save('test_animation.gif',writer='imagemagick')
一句代码就搞定了,运行成功后,会在当前目录下生成 test_animation.gif 图像。
需要注意到的是,如果要保存 gif 图像,这要求开发者电脑已经安装了 ImageMagicK。
ubuntu 用户可以通过如下命令安装。
sudo apt-get install imagemagick
并且,动画保存的时候要指定 writer 为 imagemagick.
动画可以保存为 gif 图像,自然也能保存为 mp4 视频格式。
但这要求开发者计算机已经安装好 ffmpeg 库,并且 save 方法中指定 writer 为 ffmpeg,具体细节请读者自行扩展阅读。
如何通过 Matplotlib 绘制动画及保存 GIF 图片?相关推荐
- python制作简单动画_Python通过matplotlib绘制动画简单实例
Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱, ...
- python绘制动画示例_Python使用matplotlib绘制动画的方法
本文实例讲述了Python使用matplotlib绘制动画的方法.分享给大家供大家参考.具体分析如下: matplotlib从1.1.0版本以后就开始支持绘制动画 下面是几个的示例: 第一个例子使用g ...
- python画的图怎么保存_python通过PyGame绘制图像并保存为图片文件的代码
把开发过程中常用的一些内容片段记录起来,下边内容是关于python通过PyGame绘制图像并保存为图片文件的内容,希望对大伙有较大好处. ''' pg_draw_circle_save101.py d ...
- python绘制表格并保存为图片_Python3基于plotly模块保存图片表格
使用plotly模块保存图片 目的 使用Python3的Plotly模块,实现对数据库数据的读取,然后形成Table表格,并通过钉钉机器人定时发送到钉钉群组. 难点 Plotly本身是通过html页面 ...
- 使用matplotlib绘制3D图像时插入图片
最近学了matplotlib,想要在绘制3D图像的时候插入图片,但在网上找来找去没找到比较好的,唯一找到的一个速度有点慢.于是就自己动手吧. 先放下在stackoverflow看到的答案: # 注释为 ...
- Python Matplotlib绘制多子图准备训练数据和GIF动画实践
我们程序员.设计人员,按需求辛辛苦苦开发出来的统计图形,往往达不到用户的要求,原因一般是表达不全面,也有内容过多而比较乱,真是众口难调. 其实,是我们表达方式与业务人员工作脱节.业务人员看了一张图或及 ...
- python matplotlib绘制gif动图以及保存
python matplotlib绘制gif动图以及保存 标签: python matplotlib 谨以此文纪念我两天来的悲剧 昨天我用lstm拟合sin曲线,看到别人画的做的动图很好看,并且还能保 ...
- python制作简单动画_Python通过matplotlib简单绘制动画实例
Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条 ...
- [Tips]matplotlib 命令行画图保存
服务器上没有图形界面,需要用matplotlib画图并直接保存成图片,然后下载到客户端查看. 1. 首先安装matplotlib: python -m pip install -U matplotli ...
最新文章
- shell 中柏开机显示efi_中柏 ezpad 平板安装Fedora 21 (Linux)
- TOP命令的补充笔记
- 使用Android Studio新建Project并建立多个module
- MySQL----联结
- 如何备考上海市高等学校计算机一级,如何备考全国计算机一级等级考试
- Hessian序列化复杂对象
- [css] 说下background-color:transparent和opacity:0的区别是什么?
- 大数据学习笔记01:大数据概述
- Linux文件句柄占用数量查看与设置
- 【剑指Offer】60、把二叉树打印成多行
- 引文工具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 死磕jdk源码之如何注释
- 4G标准LTE成争执焦点 中兴华为或以和解收场
- Aviary 滤镜 教程 照片编辑器
- css炫酷标题,炫酷 CSS 背景效果的 10 个代码片段
- rk3568 android 11 默认壁纸
- 笔记:分布式大数据技术原理(一)Hadoop 框架
- OJ笔记 18939 最长单词
- linux find 隐藏,使用find命令查找Linux中的隐藏文件的方法
- C语言及程序设计 实践参考——个人所得税计算器switch语句版
热门文章
- 易推宝网站推广关键词组合设置有什么技巧?
- 服装工业新消费·PLM
- MPLS BGP配置实例及抓包分析
- 前后端分离学习笔记(5) ---[表单的增删改操作;以及为管理员上传头像]
- 计算机配机方案及理由报告,大学生社会调查计算机配机方案的报告范本.docx
- Unable to find a version of the runtime to run this application解决方法
- 【GCN-RS】ItemKNN+WMF=UltraGCN:(CIKM‘21)
- 深眸科技分享—一文详解工业视觉系统构成及应用
- 将分数阶工具箱FOMCON加入simulink中
- Java中常见的final类