此示例在 Jupyter 笔记本中设置内联动画。我想可能还有一种方法可以导出为 gif,但到目前为止我还没有研究过。
不管怎样,首先要做的就是摆好桌子。我从Export a Pandas dataframe as a table image 大量借用render_mpl_table 代码。
这个问题的(改编的)版本是:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from IPython.display import HTML
import six
width = 8
data = pd.DataFrame([[0]*width,
[0, *np.random.randint(95,105,size=width-2), 0],
[0, *np.random.randint(95,105,size=width-2), 0],
[0, *np.random.randint(95,105,size=width-2), 0]])
def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14,
row_color="w", edge_color="black", bbox=[0, 0, 1, 1],
ax=None, col_labels=data.columns,
highlight_color="mediumpurple",
highlights=[], **kwargs):
if ax is None:
size = (np.array(data.shape[::-1]) + np.array([0, 1])) *
np.array([col_width, row_height])
fig, ax = plt.subplots(figsize=size)
ax.axis('off')
mpl_table = ax.table(cellText=data.values, bbox=bbox, colLabels=col_labels,
**kwargs)
mpl_table.auto_set_font_size(False)
mpl_table.set_fontsize(font_size)
for k, cell in six.iteritems(mpl_table._cells):
cell.set_edgecolor(edge_color)
if k in highlights:
cell.set_facecolor(highlight_color)
elif data.iat[k] > 0:
cell.set_facecolor("lightblue")
else:
cell.set_facecolor(row_color)
return fig, ax, mpl_table
fig, ax, mpl_table = render_mpl_table(data, col_width=2.0, col_labels=None,
highlights=[(0,2),(0,3),(1,2),(1,3)])
在这种情况下,以不同颜色突出显示的单元格由指定行和列的元组数组给出。
对于动画,我们需要设置一个绘制不同高光的表格的函数:
def update_table(i, *args, **kwargs):
r = i//(width-1)
c = i%(width-1)
highlights=[(r,c),(r,c+1),(r+1,c),(r+1,c+1)]
for k, cell in six.iteritems(mpl_table._cells):
cell.set_edgecolor("black")
if k in highlights:
cell.set_facecolor("mediumpurple")
elif data.iat[k] > 0:
cell.set_facecolor("lightblue")
else:
cell.set_facecolor("white")
return (mpl_table,)
这会强制更新表格中所有单元格的颜色。 highlights 数组是根据当前帧计算的。在此示例中,表格的宽度和高度是硬编码的,但根据输入数据的形状进行更改应该不会太难。
我们基于现有的 fig 和更新函数创建动画:
a = animation.FuncAnimation(fig, update_table, (width-1)*3,
interval=750, blit=True)
最后我们在笔记本中显示它:
HTML(a.to_jshtml())
我把这些放在了github上的一个notebook里,见https://github.com/gurudave/so_examples/blob/master/mpl_animation.ipynb
希望这足以让您朝着正确的方向前进!