前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matplotlib Animations 数据可视化进阶

Matplotlib Animations 数据可视化进阶

作者头像
代码医生工作室
发布2019-10-23 20:20:38
1.2K0
发布2019-10-23 20:20:38
举报
文章被收录于专栏:相约机器人相约机器人

如果你对我的代码有兴趣,可以在我的 GitHub 查看。当你第一次执行时,代码会报错(我一直没有解决),但是同样的代码框再执行一次,就能够正常跑通了。Matplotlib 是一个专业的数据可视化的 Python 包。除了折线图、直方图和热力图,Matplotlib HIA可以实现一些简单的动画。

如下图所示,以John Conway 的游戏人生,作为我第一个 Python 动画的素材。这个 gif 图的最后结果:

游戏人生
游戏人生

如果你对我如何对游戏人生进行编程感兴趣,可以查看我 GitHub 上面的代码(和评论)。这篇博客侧重如何在 Python 中使用 Matplotlib 增加动画。

如果对这个模拟过程不熟悉(过程更像模拟而非正在玩游戏),这里有一些建议:

  • 我们首先建立一个 N x N 大小的面板 (在我们目前讨论的面板中是 50 x 50)。
  • 我们随机选择一部分格子进行填充 (首次模拟,我随机在2500个格子里面填充了1500个),这里的一个格子代表一个单元格
  • 每一个填充的格子的周围至多有一个格子为死亡
  • 每一个填充的格子的周围有至少四个格子不会死亡
  • 每一个填充的格子的周围有两到三个格子存活
  • 每一个被三个填充格子相邻的空格子将会成为一个新的单元格

开始

我们先引入我们需要的 Python 包,利用 matplotlib 动画模块的 FuncAnimation() 函数。

代码语言:javascript
复制
import time
from IPython import display
import matplotlib.pyplot as plt
import matplotlib.animation as animation

FuncAnimation() 陆续重复调用函数,是的一个图片动画化,每一次调用更新一次图片。下面将一步步解释这个过程。

首先,我们先初始化面板。以下几行代码将产生输入数据:

  • 我们想要一个 50x50 大小的面板。
  • 填充变量使计算相邻单元格变得更容易,通过用总是空的额外单元格填充边缘,我们使它不需要编写额外的逻辑来处理板的边缘。因此,我们的50x50板被一个空单元格边界包围,使得实际的numpy数组的大小为52 x52。
  • 变量 initial_cells 代表我们想要初始化的单元格数量,他们会随机在面板上产生。
代码语言:javascript
复制
# 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)])

然后轮到实例化这个面板。使用 numpy 向量 my_board 代表我们的面板,我们初始化52x52结构的向量,值都是0(由于边缘填充所以比50x50大一些),然后调用函数 init_board() 使用 pos_list 中的坐标填充面板。具体查看 GitHub。

代码语言:javascript
复制
# Initialize the board
my_board = np.zeros((boardsize+pad, boardsize+pad))
my_board = init_board(pos_list, my_board)

设置面板的动画

我们一直在等待的部分——动画!首先,我们需要做一些例行工作。用下面几行代码创建matplotlib图形,它将用于显示我们的动画。

代码语言:javascript
复制
# Required line for plotting the animation
%matplotlib notebook
# Initialize the plot of the board that will be used for animation
fig = plt.gcf()

是时候做第一帧了,matplotlib中的imshow()函数接受一个numpy矩阵并将其呈现为图像,酷~

代码语言:javascript
复制
# Show first image - which is the initial board
im = plt.imshow(my_board)
plt.show()

我们传递imshow()的变量是我们的初始面板,它存储在my_board中。创建的图像是这样的:

  棋盘的初始状态(黄色=单元格 )
棋盘的初始状态(黄色=单元格 )

现在我们要加一个辅助函数给 FuncAnimation() 调用。辅助函数 animate() 的输入是帧数,指明当前是第几帧。在 FuncAnimation() 中,每过一帧,就会调用一次 animate() 并且把帧数作为参数输入。animate() 里会先调用 update_board() 更新当前的面板,然后通过 set_data() 将更新的面板显示出来。

代码语言:javascript
复制
# 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 帧,也就是说 200 帧后动画会自动结束。
  • interval 是每两帧的间隔时间,单位为毫秒。这里我们用 50 毫秒。
代码语言:javascript
复制
# This line creates the animation
anim = animation.FuncAnimation(fig, animate, frames=200, interval=50)

这样就完成了,还可以吧?最终效果是这样的

结论

我希望这对你有帮助。在我结束之前,让我来集思广益一些更多的数据科学,比如我们今天学到的动画功能的应用:

  • 一次次地进行蒙特卡罗模拟,以便观察结果分布是如何逐渐形成的。
  • 遍历时间序列数据,以便描述模型或数据在新观测数据到达时的反应。
  • 突出显示你的算法识别的集群如何随着输入(如集群数量)的改变而改变。
  • 关联随时间或跨数据的不同子样本的热图,以可视化不同的样本可能如何影响模型的估计参数。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始
  • 设置面板的动画
  • 结论
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档