Как создать анимированную двумерную гистограмму в Python

У меня есть код для создания двумерной гистограммы, как показано ниже. Он работает для создания статической диаграммы, но мне нужно создать анимированную тепловую карту, которая меняется в зависимости от столбца «минута_игра». Как мне это сделать? Изображение образца данных и вывода прилагаются. Ниже приведен код, который я использовал для создания 2D-гистограммы (тепловой карты).

Как создать анимированную двумерную гистограмму в Python

Как создать анимированную двумерную гистограмму в Python

multicolor = ["#ffffff","#e2eeff", "#c3d8f9","#80bdff", "#42b0f5",
              "#a0e242", "#d1cb1c", "#a06a20", "#872a10", "#630d02", "#000000"]
bins = 100

densities,_,_ = np.histogram2d(heatmap_df.params_pos_x, heatmap_df.params_pos_y, bins=bins)
percentiles = [0,1,10,20,30,40,50,60,70,80,99,100]

bounds = []
for i in percentiles:
 bounds.append(np.percentile(np.unique(densities),i))

cmaplist = multicolor
cmap = mpl.colors.LinearSegmentedColormap.from_list(
           'Custom cmap',
            cmaplist,
            len(percentiles))
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
plt.hist2d(heatmap_df.params_pos_x,
           heatmap_df.params_pos_y,
      bins = bins,
      norm = norm,
       cmap = cmap)
cbar = plt.colorbar(ticks = bounds)
plt.show()

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

https://plotly.com/python/v3/heatmap-animation/

Можете ли вы добавить определение heatmap_df в свой код?

M.A. 07.06.2024 13:43

В matplot есть matplotlib.animation.FuncAnimation — каждые несколько миллисекунд он запускает вашу функцию, в которой вы заменяете предыдущие данные новыми данными, и это создает анимацию.

furas 07.06.2024 14:02

Уже ответили, вы все еще хотите анимировать в Plotly?

r-beginners 08.06.2024 04:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пример того, как этого добиться вместе с образцами данных. В моем случае я сделал это в блокноте Jupyter:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.colors as mcolors
from IPython.display import HTML

np.random.seed(0)
num_entries = 1000
num_minutes = 10

minute_play = np.random.choice(range(num_minutes), size=num_entries)
params_pos_x = np.random.uniform(0, 100, num_entries)
params_pos_y = np.random.uniform(0, 100, num_entries)

heatmap_df = pd.DataFrame({
    'minute_play': minute_play,
    'params_pos_x': params_pos_x,
    'params_pos_y': params_pos_y
})

bins = 50
multicolor = ["#ffffff", "#e2eeff", "#c3d8f9", "#80bdff", "#42b0f5",
              "#a0e242", "#d1cb1c", "#a06a20", "#872a10", "#630d02", "#000000"]
percentiles = [0, 1, 10, 20, 30, 40, 50, 60, 70, 80, 99, 100]

densities, _, _ = np.histogram2d(heatmap_df['params_pos_x'], heatmap_df['params_pos_y'], bins=bins)
bounds = [np.percentile(np.unique(densities), i) for i in percentiles]

cmap = mcolors.LinearSegmentedColormap.from_list('Custom cmap', multicolor, len(percentiles))
norm = mcolors.BoundaryNorm(bounds, cmap.N)

fig, ax = plt.subplots()
cbar = fig.colorbar(plt.cm.ScalarMappable(norm=norm, cmap=cmap), ax=ax, ticks=bounds)
cbar.set_label('Density')

def update(frame):
    ax.clear()  # Clear the previous plot
    minute_data = heatmap_df[heatmap_df['minute_play'] == frame]
    hist = ax.hist2d(minute_data['params_pos_x'], minute_data['params_pos_y'], bins=bins, cmap=cmap, norm=norm)
    ax.set_title(f'Minute: {frame}')

ani = animation.FuncAnimation(fig, update, frames=np.arange(heatmap_df['minute_play'].min(), heatmap_df['minute_play'].max() + 1),
                              repeat=False)

HTML(ani.to_jshtml())

который дает

Чтобы сохранить его:

ani.save('animated_heatmap.mp4', writer='ffmpeg')

или

ani.save('animated_heatmap.gif', writer='imagemagick')

эй, это именно то, что мне нужно, только несколько вопросов: понимаете ли вы, что столбцы плотности на диаграмме не изменились вместе с анимацией? В моем случае это влияет на выходную тепловую карту и делает ее размытой по мере увеличения минутного воспроизведения.

Quang Dang Hong 07.06.2024 14:50

Мне нужны ваши данные, чтобы это проверить. А пока, 编码愉快!

Serge de Gosson de Varennes 07.06.2024 15:21

Серж, надеюсь, ты не возражаешь, что я добавил эту замечательную демо-версию в свой блокнот с демо-анимационными сюжетами, который ты можешь легко запустить и запустить без каких-либо установок, используя любой значок запуска здесь . Поскольку этот сюжет создает виджет контроллера на основе JavaScript, он остается работоспособным в представлениях блокнота, отображаемых nbviewer, специально здесь для этого блокнота. (GitHub в настоящее время не отображает контроллер и даже не пытается отобразить этот большой блокнот.)

Wayne 07.06.2024 17:43

Это второй снизу там.

Wayne 07.06.2024 17:45

Без проблем! Рад, что вы нашли ему применение. Если это то, что вы хотели, не забудьте принять ответ (он исчезнет из списка вопросов без ответа) и/или проголосовать за него.

Serge de Gosson de Varennes 07.06.2024 18:01

Конечно, @SergedeGossondeVarennes. Вот пример данных drive.google.com/file/d/1xldhT1_lYMQm3RHNJxAG6NSFByoEKMPF/…

Quang Dang Hong 08.06.2024 11:22

Другие вопросы по теме