巧用 Matplotlib 动画,让你的 Python 可视化大放异彩

2023-05-16

柠檬2069
点击右侧关注,遇见更好的自己!

巧用 Matplotlib 动画

让你的 Python 可视化大放异彩

作者:Tony Yiu

翻译:Hanz

整理:Lemonbit

译文出品:Python数据之道

—  1 

前言

如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看。第一次运行的时候会报一个错误(还没找到解决办法),不过只要再运行一次就正常了。
这篇文章虽然不是篇典型的数据科学类文章,不过它涉及到数据科学以及商业智能的应用。Python 的 Matplotlib 是最常用的图表绘制以及数据可视化库。我们对折线图、柱状图以及热力图都比较熟悉,但你知道用 Matplotlib 还能做简单的动画吗?
下面就是用 Matplotlib 制作动画的例子。展示的是 John Conway 的 《The Game of Life》,这是一个 Metis(数据科学夏令营)中的编程挑战题目,同时给了我一个机会来制作我的第一个 Python 动画。看看结果的动图:

这篇文章的重点还是主要放在 python 中如何用 Matploylib 制作动画。
但如果你不太熟悉模拟游戏的话(它更像是可以看的模拟动画,而非可以玩的游戏),我来给大家介绍一下规则:
  • 一开始先设置一个 N×N 的网格(我的动画中用的是 50×50 );

  • 接着随机地向格子中填充“小细胞”(一开始随机地从 2500 个格子中选取 1500 个进行填充);

  • 如果邻居小细胞少于等于 1 个,那格子中的小细胞会死掉;

  • 如果邻居大于等于 4 个的也会死掉;

  • 只有 2 个或 3 个邻居时可以生存;

  • 空的格子中如果正好有 3 个邻居,则会长出 1 个新的“小细胞”;

—  2 

建立网格

我们首先导入所需的库。
import time	
from IPython import display	
import matplotlib.pyplot as plt	
import matplotlib.animation as animation
我们会利用  Matploylib 动画模块中的 FuncAnimation() 函数。 FuncAnimation()是通过多次调用一个函数并逐次更新图片来实现让图片动起来的。 我们来一步步地实现这个过程。
但首先,我们需要先初始化我们的网格。下面的几行代码用来存储我们输入的数据:
  • 我们需要一个 50×50 大小的网格;

  • pad 变量可以使得计算邻居变得更容易。通过在边界外添加一层空白格子,我们就不需要额外再写一个逻辑来处理网格的边界。因此我们 50×50 的网格其实是被一圈空白格子包围着,这使得实际的 numpy 序列的大小为 52×52;

  • initial_cels 变量表示在网格启动的时候我们想要多少“小细胞”。他们会被随机地分布在网格上。

# Input variables for the board	
boardsize = 50        # board will be X by X where X = boardsize	
pad = 2               # padded border, do not change this!	
initial_cells = 1500  # this number of initial cells will be placed	
                      # in randomly generated positions
接下来我们随机地生成一系列“小细胞”的初始坐标(上面我们选择了 1500 个)。把这些坐标存储在  pos_list 变量中。
# Get a list of random coordinates so that we can initialize	
# board with randomly placed organisms	
pos_list = []	
for i in range(initial_cells):	
    pos_list.append([random.randint(1, boardsize),	
                     random.randint(1, boardsize)])
然后我们是时候该初始化网格了。我们会用一组叫  my_board 的 numpy 序列来代表我们的网格——我们先生成一个 52×52 数值为 0 的矩阵序列作为开始(比 50×50 大是由于增加了空白边缘),然后调用  init_board() 函数来根据  pos_list 中的坐标把“小细胞”填充到网格中。辅助函数的具体细节我不再展开讲了,不过我把他们都整理到我的 Github 上了。
# Initialize the board	
my_board = np.zeros((boardsize+pad, boardsize+pad))	
my_board = init_board(pos_list, my_board)

—  3 

制作网格动画

这是我们最期待的部分——动画!首先,我们需要完善一些配置。下面的几行代码用来生成展示我们动画的  mtplotlib 图框。
# Required line for plotting the animation	
%matplotlib notebook	
# Initialize the plot of the board that will be used for animation	
fig = plt.gcf()
接下来制作我们的第一帧。  mtplotlib 中的  imshow() 函数可以接收一组  numpy 矩阵然后返回一张图片。很酷吧!
# Show first image - which is the initial board	
im = plt.imshow(my_board)	
plt.show()
传入  imshow() 的变量是我们的初始的网格  my_board。生成的图片长这样:
现在我们需要写一个可以给  FuncAnimation() 调用的辅助函数。  animate() 函数接受一帧画面作为输入充当计数器。这个画面计数器就是  FuncAnimation() 和  animate() 函数沟通的桥梁——在每一个时间点(也就是每一帧),它都会调用一次  animate()。然后  animate() 会逐次使用辅助函数  update_board() 来对网格进行迭代。最后,  set_data() 函数将图片更新为迭代后的网格,这就完成了。
# Helper function that updates the board and returns a new image of	
# the updated board animate is the function that FuncAnimation calls	
def animate(frame):	
    im.set_data(update_board(my_board))	
    return im,
一切顺利!我们准备调用  FuncAnimation() 函数了。注意输入的参数:
  • fig 是我们在前面创建的用来装载我们的动画的图形变量;

  • animate 是 FuncAnimation() 用画面计数器进行沟通的函数(自动传入,不需要特别声明)

  • frames 表示我们希望动画持续多少帧,在这里我们想要动画的长度为 200 帧;

  • interval   表示每一帧之间间隔的毫秒数。我们想要每帧之间间隔 50 毫秒。
# This line creates the animation	
anim = animation.FuncAnimation(fig, animate, frames=200,	
                               interval=50)
就这么简单!不是很难吧?为了庆祝我们成功制作动画,我再送大家一个动画:

—  4 

总结

希望这篇文章能帮到大家。在结束之前,让我来帮助大家脑补更多我们今天学到的动画功能在数据科学上的应用:
  • 一个个地画出蒙特卡洛模拟数据,你能观察到最终的分布是如何逐步形成的;

  • 按顺序遍历时间序列数据,可以描绘你的模型或数据在新的观察角度下有什么表现;

  • 当你改变输入参数时,比如族群数,可以展现你的算法是如何划分族群的;

  • 根据时间或不同的数据子集生成关联热力图,用于观察不同的样本是如何影响你的模型的预期参数的。

Github: https://github.com/yiuhyuk/game_of_life
来源:https://towardsdatascience.com/spice-up-your-python-visualizations-with-matplotlib-animations-d437d7e98e67

本文来自公众号读者翻译,欢迎各位童鞋向公号投稿,点击下面图片了解详情!

译者简介
Hanz,港科大硕士,三年互联网产品经理。自学数据分析及人工智能技术,现于美国梅奥医院医学信息实验室担任研究员。

-------------------End-------------------

640?wx_fmt=jpeg

 「Python数据之道 」建立了读者交流群,大家可以添加管理员微信进行加群
扫描添加好友
回复 “ 资源
  • 可视化神器推荐(Plotly Express)

  Python数据之道  
让数据更有价值
回复 “600”,
获取《Python知识手册》
同学们,支持就请右下角点640?wx_fmt=gif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

巧用 Matplotlib 动画,让你的 Python 可视化大放异彩 的相关文章

  • 在Ubuntu14.04不能添加PPA源到apt源的问题解决方法

    在Ubuntu14 04使用apt get 更新Git 时 xff0c 需要更新apt源 xff0c 添加一个带有最新Git的源 xff0c 如下命令 xff1a sudo add apt repository ppa git core p
  • android 12 framework开发第53节-Activity的reLaunch及onConfigurationChanged android源码分析

    hi xff0c 同学们大家好 xff01 1 Configuration应用开发背景 今天要给大家分享内容就是我们应用开发时候经常会遇到问题 xff0c 那就是如果系统一些属性变化了 xff0c 比如语言 xff0c 横竖屏幕 xff0c
  • QT 线程,实现生产者-消费者模式

    一 两种启动线程方式 xff1a 1 QThread 2 QObject moveToThread 函数 可以让 调用者的 槽中的代码 xff0c 在单独的线程执行 注 xff1a 如果该对象有 父对象 xff0c 那么它无法被移动 二 线
  • 【easyui学习笔记】3.easyui布局之边框布局

    学习参考 xff1a EasyUI 为网页创建边框布局 建设稍微实用点的界面都离不开布局 xff08 layout xff09 xff0c 我们先来了解最简单的一种布局 xff1a 边框布局 xff08 border layout xff0
  • Android的四种启动模式以及onNewIntent方法

    前言 想起来写这个是因为之前在开发过程中遇到在onStart 方法中使用getIntent 方法无法获取到启动activity时传入的数据 xff0c 也是纳闷了很久 xff0c 然后就决定好好看一下这个地方 xff0c 本文章会结合简单的
  • selenium webdriver 页面css和xpath定位

    对于html来说 xff0c 不管用什么浏览器打开 xff0c 他的架构是不变的 xff0c 所以对于编写自动化测试程序来说 xff0c 基于什么浏览器开发 xff0c 差异不大 xff0c 所以这里推荐使用chrome 65或以后版本浏览
  • Ubuntu 18.04 +Nvidia gtx 1650 显卡驱动安装

    1 Adding this PPA to your system You can update your system with unsupported packages from this untrusted PPA by adding
  • 详解https请求Nginx转发tomcat变成http问题

    概述 分享一个最近处理的nginx转发问题 xff0c 简单记录下 一 问题现象 简单架构为nginx做负载均衡 xff0c 后端用tomcat做容器 浏览器和 Nginx 之间走的 HTTPS 通讯 xff0c 而 Nginx 到 Tom
  • Zookeeper启动出现闪退问题解决

    1 检查环境变量是否配置了JAVA HOME xff0c 若是没有配置 xff0c 需配置才可以 xff08 由于zkEnv cmd文件中使用了JAVA HOME xff09 2 打开zkEnv cmd文件 xff0c 加上pause xf
  • WIN10下全新的部署和映像处理工具DISM

    DISM xff08 Deployment Image Servicing and Management xff09 就是部署映像服务和管理 DISM exe 用于安装 卸载 配置和更新脱机 Windows R 映像和脱机 Windows
  • 富文本显示不全自动省略

    使用富文本时 xff0c 文字一行 xff08 n行 xff09 显示不全 xff0c 末尾文字省略 简介 CGSize maxSize 61 CGSizeMake MAX MAXFLOAT 调整行间距 NSMutableParagraph
  • 普通用户安装管理Keepalived

    普通用户安装管理Keepalived 介绍安装授权给普通用户修改配置文件keepalived 配置检测脚本配置普通用户启动keepalived 介绍 负载均衡 Load Balance xff0c 简称LB 是一种服务或基于硬件设备等实现的
  • Arch Linux 安装小记

    Arch Linux 安装小记 这只是一篇随笔 xff0c 用来记录从全新安装 Arch Linux 开始 xff0c 到在使用过程中各种软件配置的过程 其实对于 Arch Linux 这样滚动更新的 Linux xff0c 很少需要重新安
  • Java Collections的min和max方法

    方法一 public static lt T extends Object amp Comparable lt super T gt gt T min Collection lt extends T gt coll 此方法需要传入一个实现了
  • 【高效工作】Sublime Text 3 美化

    参考 xff1a 炫酷的sublime text3主题 准备一个良好的工作环境会让人更加乐于工作 xff0c 现代的程序猿都有一颗geek的心 xff0c 谁能忍受整天在一个丑陋的UI下coding xff1f xff01 所以今天就简单介
  • oom killer &lmkd killer

    目录 oom killer amp reaper task 进程内存回收 杀进程内存回收 lmkd killer psi vmpressure 事件通知 内核psi 实现 内核vmpressure oom killer amp reaper
  • O 上新增 TaskSnapshot

    任务快照 https source android google cn devices tech perf task snapshots examples and source android P https developer andro
  • 2021.08.29_Android_设备配置改变和Activity处理

    Android设备那些配置会改变 xff1f 34 mcc 34 IMSI 移动国家 地区代码 MCC 发生了变化 检测到了 SIM 并更新了 MCC 34 mnc 34 IMSI 移动网络代码 MNC 发生了变化 检测到了 SIM 并更新
  • arcolinux使用i3wm窗口管理器

    arcolinux使用i3wm窗口管理器 i3wm手册 安装i3 一条命令 sudo pacman S i3 然后在arcolinux里面自己选择窗口管理器 arcolinux的文件管理器默认是 dolphin Dolphin使用就是直接
  • 我的 archinstall 使用手册

    我的 archinstall 使用手册 1 使用放大字体 xff0c 保护你的眼睛 archlinux 里面 tty 默认的字体是非常小的 setfont usr share kbd consolefont LatGrkCyr 12x22

随机推荐

  • Spring配置详解

    Spring 配置详解 1 配置bean元素 基本属性 lt 配置bean元素 name xff1a 给对象起个名字 class 类的完整路径 id 唯一 里面不初选特殊字符 struts sadfAction gt lt bean nam
  • 企业微信公众账号自定义应用模块中撤回历史消息的方法

    企业微信 xff0c 公众账号自定义应用模块中撤回历史消息的方法 注意 xff1a 此方法适用于撤回超过24小时的历史消息 下载这个工具 xff1a postman xff1a http www downza cn soft 205171
  • windows的BAT或者linux的VI下批量更改替换文件名的脚本

    windows 的BAT 或者linux 的VI 下批量更改替换文件名的脚本 本来离开写脚本有些日子了 xff0c 倒是现在有些文件处理或者EXCEL 工作簿要处理的话 xff0c 还是会用简化流程来处理 脚本函数则帮我解决了很多麻烦事 昨
  • 室内定位技术及机场方案建议

    室内定位技术发展现状 在1996年左右 xff0c 美国联邦通信委员会 xff08 FCC xff09 要求移动运营商为移动电话用户提供E 911 xff08 紧急救援 xff09 服务 1999年 xff0c FCC又对定位精度做出新的要
  • 如何让ActiveXObject( "Microsoft.XmlDom ")对象在非IE浏览器下显示数据?firefox(火狐)

    在IE浏览器下 xff0c xmlDom对象一般这样被定义 xff1a var xmlDom 61 new ActiveXObject 34 Microsoft XMLDOM 34 为了兼容Firefox xff0c 需要修改为 xff1a
  • 【easyui学习笔记】4.动态添加标签页

    参考 xff1a EasyUI 动态添加标签页 xff08 Tabs xff09 1 静态添加标签页 xff08 tabs xff09 静态添加标签页十分简单 xff0c 使用class属性为easyui tabs的div即可 xff0c
  • BIM+GIS建设与运维管理工作建议

    背景 xff1a BIM 43 GIS项目的建设意见 xff0c 就弱电的建设和运维方向提出相关需求 xff1b 在BIM模型建设时期 xff0c 面向弱电专业的建设建议 参考行业规范 xff1a 在机场工程项目的建设阶段 xff0c 各参
  • 修改svn默认端口

    Subversion有两种不同的配置方式 xff0c 一种基于它自带的轻量级服务器svnserve xff0c 一种基于非常流行的Web服务器Apache 根据不同的配置方式 xff0c Subversion使用不同的端口对外提供服务 基于
  • 项目、系统开发中的需求分析说明书和需求规格说明书的区别

    项目组成员在针对要开发的系统做需求调研后 xff0c 就要编写对应的需求说明书 作为软件工程师 xff0c 你就得知道需求分析说明书和需求规格说明书的区别 xff0c 以期在正确的时候编写正确的需求文档 两者有何不同 xff1a xff08
  • C/C++内存管理详解[转载]

    我觉得这是一篇很不错的文章 xff0c 对C和C 43 43 的程序员来说 xff0c 很有实用价值 xff0c 故推荐给大家 作者 xff1a PingPong 文档来源 xff1a CSDN 伟大的Bill Gates 曾经失言 xff
  • 项目启动会应该注意的几点

    摘要 xff1a 开个好头 xff0c 万事不难 项目启动会作为项目建设生命周期的开始 xff0c 其意义和难度不言而喻 作为项目管理办公室的负责人 xff0c 需要特别重视项目启动会的召开 xff0c 杜绝走过场 xff0c 避免虽然知道
  • 飞机的航班代码/航班号码的编号规则

    以下内容来源于网络 xff0c 并整理而得 一 国内航班 中国国内航班号的编号规则 xff1a 航空公司的两字代码 43 4位数字 其中 xff0c 后面四位数字的第一位代表航空公司的基地所在地区 第二位代表航班基地外终点所在地区 xff0
  • 机场生产运行数据统计指标-第四篇-机场运行保障类

    机场运行保障类 1 民航航班正常统计 1 1 统计说明 xff08 1 xff09 统计范围的相关说明 xff1a 1 民航航班正常统计范围 xff1a 国内外运输航空公司执行的客货运航班 xff0c 包括正班 加班 包机 港澳台地区及国际
  • Python入门学习--环境配置

    工作将近两年了 xff0c 做过B S结构的项目 xff0c 也做过android xff0c 也做过C S结构的项目 xff0c 相信无论是那种项目都是基于Java 学习运用Java也已经好多年了 xff0c 虽然也接触过C C 43 4
  • Python入门学习-数据类型

    一 类型的概念 首先 xff0c 对于一个数据1011100 xff0c 改怎么解释呢 xff1f 同Java等变成语言类型 xff0c 首先我们要明确数据的类型 xff0c 程序设计语言不允许语法歧义 xff0c 因此需要明确数据的类型
  • 流年似水 启航2019

    凌晨1点无意间看到一个演讲视频 感谢你给我机会上场 xff0c 很久之前的一个演讲视频 xff0c 看完除了羡慕还是羡慕吧 xff0c 也许就是一句话吧 xff0c 开挂的人生不需要解释 30多年的生活他做了很多事 xff0c 也做成了很多
  • 使用Python代码下载网易音乐歌曲

    刚刚写了一堆 xff0c 最终放弃了 xff0c 后来百度查找到一个接口 xff0c http music 163 com song media outer url id 61 这里填歌曲id mp3 这个URL就可以下载了 xff0c 现
  • Spring是如何管理Bean

    常常听老师说容器 xff0c 容器是什么 xff1f spring中是如何体现的 xff1f 一直有疑惑 xff0c 这两天看了一下Spring管理bean的Demo xff0c 对于Spring中的容器有了简单的认识 我们知道 xff0c
  • Python如何用TKinter搭建图形界面窗口,并通过多进程的方式调用功能函数

    用Python开发图形界面和程序时 xff0c 经常会对图形界面的搭建感到失望 xff0c 或许是由于对图形界面不熟悉的原因吧 xff0c 总之一想到图形界面 xff0c 就感觉会很费时 费力 xff0c 编程的积极性大幅下降 最近 xff
  • 巧用 Matplotlib 动画,让你的 Python 可视化大放异彩

    柠檬2069 点击右侧关注 xff0c 遇见更好的自己 xff01 巧用 Matplotlib 动画 让你的 Pyt