Matplotlib动图:FuncAnimation实现
如果你觉得CSDN上都是垃圾,你就去建设它,写点没那么垃圾的东西
想用python画个动图,搜索一番发现可以用matplotlib.animation.FuncAnimation实现,但是官方文档写的不是很清楚且没给例子,网上找的别的代码写的又不太干净,导致我画的时候花了点功夫debug(和怀疑人生)。于是自己动手写了一篇总结一下。
以及提前说明下,这篇里面没有保存gif相关的内容。
先贴官方文档:这里
FuncAnimation是一个类(不是函数),初始化参数如下:
class matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
可以对照最后我的用法一起看。
比较关键的参数就是fig, func, frames这几个。后面的内容会比较长。太长不看版:运行的逻辑就是,每画一帧时,传入的func
都会被执行一次。这个func
一般是画图用的,那么,图画在哪呢?在传入的fig
里面。是什么控制func
,让它每帧画出的内容是不同的呢?答案就是frames
里的元素。
下面来一一说明:
- fig: Figure类
官方描述:
The figure object used to get needed events, such as draw or resize.
Figure就是我们用matplotlib的时候跳出来的窗口,传给FuncAnimation后,后续的动图就都在这个Figure上进行了。
顺便提一下,我画的时候遇到了一个问题:我是在一个函数里面写的这句,然后没有生效。结合warning来看,是因为这个instance被回收了。所以debug的时候就很好奇,我难道不应该是有一个函数,执行完了才能出函数体,这个instance才能被回收吗?于是拜读了一下源码。答案在FuncAnimation的基类,Animation的__init__
中:
self._first_draw_id = fig.canvas.mpl_connect('draw_event', self._start)
这句的意思是把我们创建的FuncAnimation
instance 和传入的fig的开始句柄绑定在一起。后续画动图还是要靠这个instance执行才可以。所以,在我下面写的函数里面,如果我不把它传出去导致它被回收掉,这样是不会有效果的。
(个人理解,如果有不对的地方欢迎指正)
- func
官方说明:
func: callable
The function to call at each frame. The first argument will be the next value in frames. Any additional positional arguments can be supplied via the fargs parameter.The required signature is:
def func(frame, *fargs) -> iterable_of_artists
前面已经说过,每一帧都会执行一次func
,签名中frame
是自动传进来的参数,是我们pass给FuncAnimation
的frames
中的元素。
这个函数一般就是用来画图的。
其他教程的写法是,把画图的数据定义成全局变量,这样就避免了传参的问题。但是如果我不想用这种方法怎么办?我的项目已经很乱了,不想再增加全局变量了。
这时,就要用到官方文档说的fargs
参数。我们可以把数据传给FuncAnimation
的fargs
参数,这个参数会再传给func
。用法参见文末代码。
总之就是,只把函数传进来就好了。
- frames
frames: iterable, int, generator function, or None, optional
Source of data to pass func and each frame of the animationIf an iterable, then simply use the values provided. If the iterable
has a length, it will override the save_count kwarg.If an integer, then equivalent to passing range(frames)
If a generator function, then must have the signature:
(后略)
此处不再赘述。
最后附上我的代码:
```python
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np# 在循环绘制每一帧时,会被执行
# frame_num就是传给FuncAnimation中frames的元素
def draw_frame(frame_num, data_list):img = plt.imshow(data_list[frame_num], cmap='coolwarm')# 关于最后的逗号:这个用法不是很常见,就是返回的是一个iterable的意思。# 因为有可能会想在一帧里面画多个元素,那时就是逐一返回了。return img,# 绘图函数
def animation_test(data_list):fig = plt.figure()# 可能是函数的signature有点问题,我的ide会给frames标黄,提示需要int型输入,但是其实iterable型的也可以a = animation.FuncAnimation(fig=fig, func=draw_frame, fargs=(data_list,),frames=range(len(data_list)))# 一定要把a传出来,否则instance会被gc机制回收,不会生成动图return aif __name__ == '__main__':# make some data: 100张(5,10)的framedata_list = np.random.random((100, 5, 10))a = animation_test(data_list)plt.show()
Matplotlib动图:FuncAnimation实现相关推荐
- Matplotlib动图保存遇到MovieWriter有问题,自己写gif保存的代码
最近使用Matplotlib绘制动图时,在保存图片为GIF图时遇到TypeError: 'MovieWriterRegistry' object is not an iterator(或者会提示Mov ...
- python学习之matplotlib绘制动图(FuncAnimation()参数)
1.函数FuncAnimation(fig,func,frames,init_func,interval,blit)是绘制动图的主要函数,其参数如下: a.fig 绘制动图的画布名称 b.func自定 ...
- 从零开始学Python爬虫系列:Matplotlib FuncAnimation这1个功能,加1个更新函数,画出最简单的动图,让你爬取的数据动起来。(附:图片上加弹幕功能)
使用FuncAnimation这个包之前,别忘了安装ImageMagick,具体的安装过程可以看我bar chart race那一篇. Animation 动画的基础函数. FuncAnimation ...
- 字符动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图
1.数据可视化动图,是数据可视化的高级显示,最近很流行. 2.比如下面将告诉你如何制作一个如下的数据可视化动图. 3.例: 3.1 准备一组数据,虚拟的csv资料,对应关系如下 4个项目:namegr ...
- python制作数据增长动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图...
#第1步:导出模块,固定 importpandas as pdimportmatplotlib.pyplot as pltimportmatplotlib.ticker as tickerimport ...
- 使用python matplotlib实现动图绘制
前言 想写数据动态可视化很久了,但是网上竟然没有一份能直接用的代码,昨天终于狠下心来死啃了一波开发者文档搞定了这部分,贴一篇blog记录一下希望可以帮到你. 思路 动图的核心函数是matplotlib ...
- 一步一步教你用 Matplotlib 保存 GIF 动图
写在前面:为了可视化机器学习过程,并且保存下来,所以想直接利用 保存动图,期间参考了好多资料,过程比较艰辛,所以想记录下来.当然,此文还参考了好多网上的其它文章,再此一并感谢那些热爱分享的 ,并且参考 ...
- matplotlib.animation绘制动图并保存
主要运用matplotlib.animation,保存动图的代码为: ani.save("test.gif", writer='pillow') writer='pillow'不能 ...
- 用matplotlib的Animation画动图
摘要:本文通过几个例子学习了 matplotlib.animation 画动图的方法 --- 对算法,数学,计算机感兴趣的同学,欢迎关注我哈,原创文章 我的网站:潮汐朝夕的生活实验室 我的公众号:潮汐 ...
- pyhthon数据分析——matplotlib绘制动图且如何保存gif动图
绘制动图需要用到matplotlib中的animation模块 import numpy as np import matplotlib.pyplot as plt from matplotlib i ...
最新文章
- 零售连锁专卖信息化解决方案简介之二
- 收藏 | CNN的一些可视化方法!
- 人工智能能否复制人脑引争论 美媒:目前AI仍存在局限性
- ITK:从均匀矩阵应用仿射变换并重新采样
- Kotlin when 流程判断
- [网络收集]Web.config配置文件详解
- iso启动盘替换文件注意修改md5sum.txt
- 密集人体姿态估计:2D图像帧可实时生成UV贴图(附论文)
- ubuntu 18.04安装php 7,如何在Ubuntu 18.04和16.04上安装PHP(7.3,7.2和7.0)?
- 如何对金蝶kis进行结转损益操作
- oracle数据库下载地址
- 小米盒子 计算机共享,教你用局域网共享文件为小米盒子装软件
- 如何修改网络游戏服务器端的数据,网络游戏服务器端编程:数据操纵语句
- Python 名称空间以及函数的补充
- 猜单词游戏更新啦 (0.88.2及1.88.3)
- MOOC网课爬虫逆向(一)
- 数据库中间件 MyCAT源码分析 —— XA分布式事务
- Red5 Client 调用 Red5 Server
- 类,__dift__,__len__,__add__,__new__,__init__
- mysql 数据精确度,MySQL中数值类型的精度探析