В этом примере показано, как настроить анимацию в блокноте Jupyter. Я полагаю, что, возможно, есть и способ экспорта в формате gif, но я пока не рассматривал это.
В любом случае, первое, что нужно сделать, это накрыть стол. Я сильно позаимствовал у Экспорт кадра данных Pandas в виде изображения таблицы для кода 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
вычисляется на основе текущего кадра. Ширина и высота таблицы в этом примере жестко запрограммированы, но это не должно быть слишком сложно изменить в зависимости от формы ваших входных данных.
Мы создаем анимацию на основе существующего фига и функции обновления:
a = animation.FuncAnimation(fig, update_table, (width-1)*3,
interval=750, blit=True)
И, наконец, мы показываем это в нашей записной книжке:
HTML(a.to_jshtml())
Я собрал это в блокноте на github, см. https://github.com/gurudave/so_examples/blob/master/mpl_animation.ipynb
Надеюсь, этого достаточно, чтобы вы пошли в правильном направлении!