Как использовать matplotlib FuncAnimation для анимации тепловой карты? - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь прочитать документацию для matplotlib.animation.FuncAnimation, чтобы анимировать тепловую карту.

Я не получаю никаких ошибок при запуске кода ниже и тепловой карты сюжет появляется, но не кажется анимированным.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib


# generate random noise for the heatmap
rnd_data = np.random.normal(0, 1, (500, 100, 100))

fig, ax = plt.subplots(figsize=(12,10))

def my_func(i):
    sns.heatmap(rnd_data[i])

anim = matplotlib.animation.FuncAnimation(fig=fig, func=my_func, frames=200, interval=500, blit=False)
plt.show()

Кажется, что результатом этого кода является единственный кадр rnd_data, а именно первый массив rnd_data[0]. Я попытался изменить количество frames и interval на большее число, так как думал, что анимация выполняется слишком быстро, чтобы я мог видеть, но это, похоже, не сработало.

Я что-то делаю не так Вот? Я думаю, что я смогу видеть, как пиксели графика меняются и перемещаются как белый шум, когда я рисую тепловую карту для такого набора данных, но это не работает. Как я могу анимировать тепловую карту?

1 Ответ

1 голос
/ 16 июня 2020

Для правильного запуска анимации вы должны использовать:

sns.heatmap(rnd_data[..., i])

, чтобы указать, что тепловая карта изменяется с течением времени вдоль третьей оси.
Полный код приведен ниже, I что-то изменил, чтобы правильно добавить шкалу цветов:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.animation import FuncAnimation

# generate random noise for the heatmap
rnd_data = np.random.normal(0, 1, (500, 100, 100))

def my_func(i):
    ax.cla()
    sns.heatmap(rnd_data[i, ...],
                ax = ax,
                cbar = True,
                cbar_ax = cbar_ax,
                vmin = rnd_data.min(),
                vmax = rnd_data.max())

grid_kws = {'width_ratios': (0.9, 0.05), 'wspace': 0.2}
fig, (ax, cbar_ax) = plt.subplots(1, 2, gridspec_kw = grid_kws, figsize = (12, 8))
anim = FuncAnimation(fig = fig, func = my_func, frames = 200, interval = 50, blit = False)

plt.show()

, которая дает мне эту анимацию:

enter image description here

...