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


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()
Я пытался следовать этому, но не совсем понял, что делать дальше, чтобы перенести свой код в это руководство.
В matplot есть matplotlib.animation.FuncAnimation — каждые несколько миллисекунд он запускает вашу функцию, в которой вы заменяете предыдущие данные новыми данными, и это создает анимацию.
пример: Анимация с использованием Matplotlib — документация Matplotlib 3.9.0
Уже ответили, вы все еще хотите анимировать в Plotly?






Вот пример того, как этого добиться вместе с образцами данных. В моем случае я сделал это в блокноте 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')
эй, это именно то, что мне нужно, только несколько вопросов: понимаете ли вы, что столбцы плотности на диаграмме не изменились вместе с анимацией? В моем случае это влияет на выходную тепловую карту и делает ее размытой по мере увеличения минутного воспроизведения.
Мне нужны ваши данные, чтобы это проверить. А пока, 编码愉快!
Серж, надеюсь, ты не возражаешь, что я добавил эту замечательную демо-версию в свой блокнот с демо-анимационными сюжетами, который ты можешь легко запустить и запустить без каких-либо установок, используя любой значок запуска здесь . Поскольку этот сюжет создает виджет контроллера на основе JavaScript, он остается работоспособным в представлениях блокнота, отображаемых nbviewer, специально здесь для этого блокнота. (GitHub в настоящее время не отображает контроллер и даже не пытается отобразить этот большой блокнот.)
Это второй снизу там.
Без проблем! Рад, что вы нашли ему применение. Если это то, что вы хотели, не забудьте принять ответ (он исчезнет из списка вопросов без ответа) и/или проголосовать за него.
Конечно, @SergedeGossondeVarennes. Вот пример данных drive.google.com/file/d/1xldhT1_lYMQm3RHNJxAG6NSFByoEKMPF/…
Можете ли вы добавить определение
heatmap_dfв свой код?