当你第一次执行时,代码会报错(我一直没有解决),但是同样的代码框再执行一次,就能够正常跑通了。Matplotlib 是一个专业的数据可视化的 Python 包。除了折线图、直方图和热力图,Matplotlib HIA可以实现一些简单的动画。
如下图所示,以John Conway 的游戏人生,作为我第一个 Python 动画的素材。这个 gif 图的最后结果:
游戏人生
如果你对我如何对游戏人生进行编程感兴趣,可以查看我 GitHub 上面的代码(和评论)。这篇博客侧重如何在 Python 中使用 Matplotlib 增加动画。
如果对这个模拟过程不熟悉(过程更像模拟而非正在玩游戏),这里有一些建议:
我们先引入我们需要的 Python 包,利用 matplotlib 动画模块的 FuncAnimation() 函数。
import time
from IPython import display
import matplotlib.pyplot as plt
import matplotlib.animation as animation
FuncAnimation() 陆续重复调用函数,是的一个图片动画化,每一次调用更新一次图片。下面将一步步解释这个过程。
首先,我们先初始化面板。以下几行代码将产生输入数据:
# 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。
# Initialize the board
my_board = np.zeros((boardsize+pad, boardsize+pad))
my_board = init_board(pos_list, my_board)
我们一直在等待的部分——动画!首先,我们需要做一些例行工作。用下面几行代码创建matplotlib图形,它将用于显示我们的动画。
# 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矩阵并将其呈现为图像。
# 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() 将更新的面板显示出来。
# 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() 了。注意函数的输入参数:
# This line creates the animation
anim = animation.FuncAnimation(fig, animate, frames=200, interval=50)
这样就完成了,还可以吧?最终效果是这样的
我希望这对你有帮助。在我结束之前,让我来集思广益一些更多的数据科学,比如我们今天学到的动画功能的应用: