如何基于Python Matplotlib实现网格动画

—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—

总结

希望这篇文章能帮到大家。在结束之前,让我来帮助大家脑补更多我们今天学到的动画功能在数据科学上的应用:

  • 一个个地画出蒙特卡洛模拟数据,你能观察到最终的分布是如何逐步形成的;
  • 按顺序遍历时间序列数据,可以描绘你的模型或数据在新的观察角度下有什么表现;
  • 当你改变输入参数时,比如族群数,可以展现你的算法是如何划分族群的;
  • 根据时间或不同的数据子集生成关联热力图,用于观察不同的样本是如何影响你的模型的预期参数的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python matplotlib 绘制双Y轴曲线图的示例代码

    Matplotlib简介 Matplotlib是非常强大的python画图工具 Matplotlib可以画图线图.散点图.等高线图.条形图.柱形图.3D图形.图形动画等. Matplotlib安装 pip3 install matplotlib#python3 双X轴的 可以理解为共享y轴 ax1=ax.twiny() ax1=plt.twiny() 双Y轴的 可以理解为共享x轴 ax1=ax.twinx() ax1=plt.twinx() 自动生成一个例子 x = np.arange(0.,

  • 解决Python Matplotlib绘图数据点位置错乱问题

    在绘制正负样本在各个特征维度上的CDF(累积分布)图时出现了以下问题: 问题具体表现为: 1.几个负样本的数据点位置倒错 2.X轴刻度变成了乱七八糟一团鬼东西 最终解决办法 造成上述情况的原因其实是由于输入matplotlib.plot()函数的数据x_data和y_data从CSV文件中直接导入后格式为string,因此才会导致所有数据点的x坐标都被直接刻在了x轴上,且由于坐标数据格式错误,部分点也就表现为"乱点".解决办法就是导入x,y数据后先将其转化为float型数据,然后输入p

  • 使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示

    一.当我们用Python matplot时作图时,一些数据需要以百分比显示,以更方便地对比模型的性能提升百分比. 二.借助matplotlib.ticker.FuncFormatter(),将坐标轴格式化. 例子: # encoding=utf-8 import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter plt.rcParams['font.family'] = ['Times New Roman']

  • python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式

    用matplotlib画二维图像时,默认情况下的横坐标和纵坐标显示的值有时达不到自己的需求,需要借助xticks()和yticks()分别对横坐标x-axis和纵坐标y-axis进行设置. import numpy as np import matplotlib.pyplot as plt x = range(1,13,1) y = range(1,13,1) plt.plot(x,y) plt.show() x坐标和y坐标都表示1到12的整数,不进行坐标设置时,执行效果为: 此时的x轴和y轴都

  • Python使用Matplotlib实现雨点图动画效果的方法

    本文实例讲述了Python使用Matplotlib实现雨点图动画效果的方法.分享给大家供大家参考,具体如下: 关键点 win10安装ffmpeg animation函数使用 update函数 win10安装ffmpeg 因为最后要将动画图保存为.mp4格式,要用到ffmpeg,去官网下载,我az下载的是windows64bit static版本的,下载后解压到软件安装常用路径,并将ffmpeg路径添加到环境变量(这个方法在最后没用,但还是添加一下) animationa函数 准确来说是anima

  • Python通过matplotlib绘制动画简单实例

    Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等. matplotlib从1.1.0版本以后就开始支持绘制动画,具体使用可以参考官方帮助文档.下面是一个很基本的例子: """ A simple example of an animated plot """ import n

  • Python使用matplotlib绘制动画的方法

    本文实例讲述了Python使用matplotlib绘制动画的方法.分享给大家供大家参考.具体分析如下: matplotlib从1.1.0版本以后就开始支持绘制动画 下面是几个的示例: 第一个例子使用generator,每隔两秒,就运行函数data_gen: # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation fig =

  • python matplotlib:plt.scatter() 大小和颜色参数详解

    语法 plt.scatter(x, y, s=20, c='b') 大小s默认为20,s=0时点不显示:颜色c默认为蓝色. 为每一个点指定大小和颜色 有时我们需要为每一个点指定大小和方向,以区分不同的点.这时,可以向s和c传入列表.如: import matplotlib.pyplot as plt import numpy as np x = list(range(1, 7)) plt.scatter(x, x, s=10*np.array(x)**2, c=x) plt.show() 参数s

  • Python matplotlib画图时图例说明(legend)放到图像外侧详解

    用python的matplotlib画图时,往往需要加图例说明.如果不设置任何参数,默认是加到图像的内侧的最佳位置. import matplotlib.pyplot as plt import numpy as np x = np.arange(10) fig = plt.figure() ax = plt.subplot(111) for i in xrange(5): ax.plot(x, i * x, label='$y = %ix$' % i) plt.legend() plt.sho

  • 如何基于Python Matplotlib实现网格动画

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

  • 基于python,Matplotlib绘制函数的等高线与三维图像

    目录 1. 网格点 2. 等高线 3. 三维图像 本篇文章记录一下函数的等高线及其三维图像的可视化方法. 本例绘制的函数为: 1. 网格点   在绘制曲线之前,先了解一下网格点的绘制.比如绘制一个3x3的网格,那么就需要9个坐标点: (0,2)-----(1,2)-----(2,2) (0,1)-----(1,1)-----(2,1) (0,0)-----(1,0)-----(2,0)   将其x轴和y轴坐标分开表示: # x轴: [[0, 1, 2], [0, 1, 2],  [0, 1, 2

  • 基于Python matplotlib库绘制箱线图

    目录 1. 关于箱线图 及 plt.boxplot()方法 2. 绘制一幅简单的箱线图 3. 绘制一幅更精致的图像 4. 异常值的标准 5. 异常值的输出 1. 关于箱线图 及 plt.boxplot()方法 箱线图又称箱形图,有的地方也可以叫盒须图.使用箱线图的好处是可以以一种相对稳定的方式描述数据离散分布情况,识别数据中的异常值. 在pthon的matplotlib库中绘制箱线图使用的是plt.boxplot()方法. 该方法的主要参数如下 参数 描述 x 要绘制箱线图的数据 notch 是

  • 基于Python+Matplotlib绘制渐变色扇形图与等高线图

    目录 渐变色扇形图 等高线 渐变色扇形图 使用 python - matplotlib 颜色地图plt.cm模块儿,来绘制出颜色渐变.更加好看的扇形图.也称彩虹图,但是也不限于彩虹图,可以选择的颜色地图(colormap)有: Paired, autumn, rainbow, gray, spring, Darks. 下边以颜色地图rainbow为例(彩虹图),写出以下代码,并展示各种颜色样式下的图像效果. import pandas as pd import numpy as np impor

  • 基于Python+Matplotlib实现直方图的绘制

    目录 1.关于直方图 2.plt.hist() 3. 绘制一幅简单的 频数 分布直方图 4. 绘制一幅 频率 分布直方图 5. 累积分布直方图(水平方向) 1.关于直方图 直方图 也称 质量分布图,虽然看起来像柱状图, 实际上区别又很大.直方图通常横轴表示数据类型,纵轴表示各数据类型的分布情况. 直方图又可以分为频数分布直方图和频率分布直方图.其绘制方法并无多少差异,只是描述的事件有所不同.频数分布直方图描述的是某事件的数量,而频率分布则描述的是其发生的频率. 而关于频率分布直方图,又可以理解为

  • 基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解

    Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在画布中创建一个绘图区.在绘图区上画几条线.给图像添加文字说明等.下面我们就通过实例代码来领略一下他的魅力. import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() 上图是我们通

  • 基于Linux系统中python matplotlib画图的中文显示问题的解决方法

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • 基于python的matplotlib制作双Y轴图

    一.函数介绍 函数:twin()函数 含义:表示共享x轴,共享表示的就是x轴使用同一刻度 二.实际应用 2.1 实验数据展示 数据表的名称:600001SH.xlsx 2.2 代码实现: 文章里使用到了Subplot()函数 # 导入相关数据包 import matplotlib.pyplot as plt import pandas as pd plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体 plt.rcParams['axes.unic

  • 教你用Python matplotlib库制作简单的动画

    matplotlib制作简单的动画 动画即是在一段时间内快速连续的重新绘制图像的过程. matplotlib提供了方法用于处理简单动画的绘制: import matplotlib.animation as ma def update(number): pass # 每隔30毫秒,执行一次update ma.FuncAnimation( mp.gcf(), # 作用域当前窗体 update, # 更新函数的函数名 interval=30 # 每隔30毫秒,执行一次update ) 案例1: 随机生

  • Python matplotlib绘制实时数据动画

    目录 一.实时数据可视化的数据准备 01.设置图表主题样式 02使用样例数据 二.使用电影票房数据制作动画 一.实时数据可视化的数据准备 import pandas as pd import matplotlib.pyplot as plt # 设置一般的样例数据 x=[0,1,2,3,4] # x轴数据 y=[0,1,2,3,4] # y轴数据 # 设置多维数据 dev_x=[25,26,27,28,29,30] # 开发者的年龄 dev_y=[7567,8789,8900,11560,167

随机推荐