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

2024-01-20 07:10

本文主要是介绍巧用 Matplotlib 动画,让你的 Python 可视化大放异彩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg

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

巧用 Matplotlib 动画

让你的 Python 可视化大放异彩

640?wx_fmt=jpeg

作者:Tony Yiu

翻译:Hanz

整理:Lemonbit

译文出品:Python数据之道

—  1 

前言

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

这篇文章的重点还是主要放在 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。生成的图片长这样:
640?wx_fmt=png
现在我们需要写一个可以给  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)
就这么简单!不是很难吧?为了庆祝我们成功制作动画,我再送大家一个动画:
640?wx_fmt=gif

—  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

这篇关于巧用 Matplotlib 动画,让你的 Python 可视化大放异彩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625175

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo