如果你觉得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里的元素。

下面来一一说明:

  1. 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执行才可以。所以,在我下面写的函数里面,如果我不把它传出去导致它被回收掉,这样是不会有效果的。
(个人理解,如果有不对的地方欢迎指正)

  1. 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给FuncAnimationframes中的元素。
这个函数一般就是用来画图的。
其他教程的写法是,把画图的数据定义成全局变量,这样就避免了传参的问题。但是如果我不想用这种方法怎么办?我的项目已经很乱了,不想再增加全局变量了。
这时,就要用到官方文档说的fargs参数。我们可以把数据传给FuncAnimationfargs参数,这个参数会再传给func。用法参见文末代码。
总之就是,只把函数传进来就好了。

  1. frames

frames: iterable, int, generator function, or None, optional
Source of data to pass func and each frame of the animation

If 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实现相关推荐

  1. Matplotlib动图保存遇到MovieWriter有问题,自己写gif保存的代码

    最近使用Matplotlib绘制动图时,在保存图片为GIF图时遇到TypeError: 'MovieWriterRegistry' object is not an iterator(或者会提示Mov ...

  2. python学习之matplotlib绘制动图(FuncAnimation()参数)

    1.函数FuncAnimation(fig,func,frames,init_func,interval,blit)是绘制动图的主要函数,其参数如下: a.fig 绘制动图的画布名称 b.func自定 ...

  3. 从零开始学Python爬虫系列:Matplotlib FuncAnimation这1个功能,加1个更新函数,画出最简单的动图,让你爬取的数据动起来。(附:图片上加弹幕功能)

    使用FuncAnimation这个包之前,别忘了安装ImageMagick,具体的安装过程可以看我bar chart race那一篇. Animation 动画的基础函数. FuncAnimation ...

  4. 字符动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图

    1.数据可视化动图,是数据可视化的高级显示,最近很流行. 2.比如下面将告诉你如何制作一个如下的数据可视化动图. 3.例: 3.1 准备一组数据,虚拟的csv资料,对应关系如下 4个项目:namegr ...

  5. python制作数据增长动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图...

    #第1步:导出模块,固定 importpandas as pdimportmatplotlib.pyplot as pltimportmatplotlib.ticker as tickerimport ...

  6. 使用python matplotlib实现动图绘制

    前言 想写数据动态可视化很久了,但是网上竟然没有一份能直接用的代码,昨天终于狠下心来死啃了一波开发者文档搞定了这部分,贴一篇blog记录一下希望可以帮到你. 思路 动图的核心函数是matplotlib ...

  7. 一步一步教你用 Matplotlib 保存 GIF 动图

    写在前面:为了可视化机器学习过程,并且保存下来,所以想直接利用 保存动图,期间参考了好多资料,过程比较艰辛,所以想记录下来.当然,此文还参考了好多网上的其它文章,再此一并感谢那些热爱分享的 ,并且参考 ...

  8. matplotlib.animation绘制动图并保存

    主要运用matplotlib.animation,保存动图的代码为: ani.save("test.gif", writer='pillow') writer='pillow'不能 ...

  9. 用matplotlib的Animation画动图

    摘要:本文通过几个例子学习了 matplotlib.animation 画动图的方法 --- 对算法,数学,计算机感兴趣的同学,欢迎关注我哈,原创文章 我的网站:潮汐朝夕的生活实验室 我的公众号:潮汐 ...

  10. pyhthon数据分析——matplotlib绘制动图且如何保存gif动图

    绘制动图需要用到matplotlib中的animation模块 import numpy as np import matplotlib.pyplot as plt from matplotlib i ...

最新文章

  1. 零售连锁专卖信息化解决方案简介之二
  2. 收藏 | CNN的一些可视化方法!
  3. 人工智能能否复制人脑引争论 美媒:目前AI仍存在局限性
  4. ITK:从均匀矩阵应用仿射变换并重新采样
  5. Kotlin when 流程判断
  6. [网络收集]Web.config配置文件详解
  7. iso启动盘替换文件注意修改md5sum.txt
  8. 密集人体姿态估计:2D图像帧可实时生成UV贴图(附论文)
  9. ubuntu 18.04安装php 7,如何在Ubuntu 18.04和16.04上安装PHP(7.3,7.2和7.0)?
  10. 如何对金蝶kis进行结转损益操作
  11. oracle数据库下载地址
  12. 小米盒子 计算机共享,教你用局域网共享文件为小米盒子装软件
  13. 如何修改网络游戏服务器端的数据,网络游戏服务器端编程:数据操纵语句
  14. Python 名称空间以及函数的补充
  15. 猜单词游戏更新啦 (0.88.2及1.88.3)
  16. MOOC网课爬虫逆向(一)
  17. 数据库中间件 MyCAT源码分析 —— XA分布式事务
  18. Red5 Client 调用 Red5 Server
  19. 类,__dift__,__len__,__add__,__new__,__init__
  20. mysql 数据精确度,MySQL中数值类型的精度探析

热门文章

  1. 【开源】STC12C5A60S2开发板
  2. c语言中小数乘整数,小数乘整数中的算法算理教学
  3. 现代治理10.0:Diligent研究院报告称,进入董事会的少数女性董事在董事会领导职务的角逐中超越男性董事
  4. ggggxc学习笔记----Vue学习笔记II----模板语法
  5. 2019.9.15训练总结
  6. 小米、华为、一加、OPPO接连入场,电视的魅力在哪里?
  7. python+request 哔哩哔哩视频下载
  8. 人工智能伦理分论坛的报告
  9. 国内十家微交易平台,正规微交易平台排行榜
  10. 2021中职网络空间安全国赛隐藏信息探索解析做题详解