(▲由Python大本营付费下载自视觉中国)
作者 | Tony Yiu
翻译 | Hanz
整理 | Lemonbit
译文出品 | Python数据之道
一开始先设置一个 N×N 的网格(我的动画中用的是 50×50 );
接着随机地向格子中填充“小细胞”(一开始随机地从 2500 个格子中选取 1500 个进行填充);
如果邻居小细胞少于等于 1 个,那格子中的小细胞会死掉;
如果邻居大于等于 4 个的也会死掉;
只有 2 个或 3 个邻居时可以生存;
空的格子中如果正好有 3 个邻居,则会长出 1 个新的“小细胞”。
from IPython import display
import matplotlib.pyplot as plt
import matplotlib.animation as animation
我们需要一个 50×50 大小的网格;
pad 变量可以使得计算邻居变得更容易。通过在边界外添加一层空白格子,我们就不需要额外再写一个逻辑来处理网格的边界。因此我们 50×50 的网格其实是被一圈空白格子包围着,这使得实际的 numpy 序列的大小为 52×52;
initial_cels 变量表示在网格启动的时候我们想要多少“小细胞”。他们会被随机地分布在网格上。
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
# 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 = np.zeros((boardsize+pad, boardsize+pad))
my_board = init_board(pos_list, my_board)
%matplotlib notebook
# Initialize the plot of the board that will be used for animation
fig = plt.gcf()
接下来制作我们的第一帧。 mtplotlib 中的 imshow() 函数可以接收一组 numpy 矩阵然后返回一张图片。很酷吧!
im = plt.imshow(my_board)
plt.show()
# the updated board animate is the function that FuncAnimation calls
def animate(frame):
im.set_data(update_board(my_board))
return im,
fig 是我们在前面创建的用来装载我们的动画的图形变量;
animate 是 FuncAnimation() 用画面计数器进行沟通的函数(自动传入,不需要特别声明)
frames 表示我们希望动画持续多少帧,在这里我们想要动画的长度为 200 帧;
interval 表示每一帧之间间隔的毫秒数。我们想要每帧之间间隔 50 毫秒。
anim = animation.FuncAnimation(fig, animate, frames=200,
interval=50)
就这么简单!不是很难吧?为了庆祝我们成功制作动画,我再送大家一个动画:
总结
希望这篇文章能帮到大家。在结束之前,让我来帮助大家脑补更多我们今天学到的动画功能在数据科学上的应用:
一个个地画出蒙特卡洛模拟数据,你能观察到最终的分布是如何逐步形成的;
按顺序遍历时间序列数据,可以描绘你的模型或数据在新的观察角度下有什么表现;
当你改变输入参数时,比如族群数,可以展现你的算法是如何划分族群的;
根据时间或不同的数据子集生成关联热力图,用于观察不同的样本是如何影响你的模型的预期参数的。
Github: https://github.com/yiuhyuk/game_of_life
来源:
https://towardsdatascience.com/spice-up-your-python-visualizations-with-matplotlib-animations-d437d7e98e67
◆
精彩推荐
◆