我創建了一個使用滑塊播放影片的函式。每個幀都由條形圖上方的熱圖(帶顏色條)組成。該函式的引數包括用于熱圖軸標簽和條形圖水平軸標簽的文本標簽串列、矩陣串列和用于條形圖的串列串列。此外,還有一個時間視窗值,標記為win_value,因此第 0 幀對應于時間 0,第 1 幀對應于win_value,第 2幀對應于 2* win_value,依此類推。
該函式的代碼如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.widgets import Slider
def heatmap_barplot_animation(labels,M_list,bar_list,win_value):
num_times=len(M_list)
fig, ax = plt.subplots(2)
plt.subplots_adjust(left=None, bottom=.2, right=None, top=.9, wspace=.2, hspace=.2)
ax_time=fig.add_axes([0.25, 0.1, 0.65, 0.03])
s_time = Slider(ax_time, 'Time', 0, num_times, valinit=0,valstep=1)
def update_graph(val):
i= s_time.val
ax[0].cla()
heatmap=ax[0].imshow(M_list[i-1*1],vmin=0, vmax=1, cmap='coolwarm', aspect='auto')
ax[0].set_xticks(range(len(labels)))
ax[0].set_xticklabels(labels,fontsize=10,)
a.x[0].set_yticks(range(len(labels)))
ax[0].set_yticklabels(labels,fontsize=10)
ax0_divider = make_axes_locatable(ax[0])
cax0 = ax0_divider.append_axes('right', size='7%', pad='2%')
cb = fig.colorbar(heatmap, cax=cax0, orientation='vertical')
ax[1].cla()
ax[1].bar(labels,bar_list[i-1])
ax[1].set_ylim(0, 1)
plt.show()
s_time.on_changed(update_graph)
s_time.set_val(0)
具有七個標簽、10 個幀和視窗值 0.25 秒的示例:
import random
labels=['a','b','c','d','e','f','g','h']
M_list=[np.random.rand(7,7) for i in range(10)]
bar_list=[[random.uniform(0,1) for i in range(Nc)] for t in range(Nt)]
win_value=.25
heatmap_barplot_animation(labels,M_list,bar_list,win_value)
影片的第三幀看起來像這樣:

我似乎無法弄清楚執行以下操作需要進行哪些修改:
- 將條形圖下方的滑塊居中。
- 更改條形圖滑塊,而不是顯示索引(上面的 3),而是顯示相應的時間值,在本例中為 0.75 秒。
uj5u.com熱心網友回復:
對于您的第一個問題,將滑塊放在子圖上的一種方法是簡單地調整子圖的位置
plt.subplots_adjust以匹配滑塊的軸。在您的代碼中,滑塊的軸定義為:ax_time=fig.add_axes([0.25, 0.1, 0.65, 0.03])因此您可能希望使用plt.subplots_adjust(left=0.25, bottom=.2, right=None, top=.9, wspace=.2, hspace=.2). 您可以使用滑塊的軸和子圖的軸來獲得所需的結果(有關滑塊位于子圖中心的示例,請參見下文)。為了回答您的第二個問題,要重新標記滑塊中的值,您只需將標簽的
valmax和valstep值更改為valmax=num_times*win_value和valstep=win_value。要索引您的M_list和bar_list陣列,您需要宣告i為i=int(s_time.val/win_value).
有關更多詳細資訊,請參閱您在實施上述修改后提供的代碼:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.widgets import Slider
import random
def heatmap_barplot_animation(labels,M_list,bar_list,win_value):
num_times=len(M_list)
fig, ax = plt.subplots(2)
plt.subplots_adjust(left=0.25, bottom=.2, right=None, top=.9, wspace=.2, hspace=.2)
ax_time=fig.add_axes([0.25, 0.1, 0.65, 0.03])
s_time = Slider(ax_time, 'Time',valinit=0,valmin=0,valmax=num_times*win_value,valstep=win_value)
def update_graph(val):
i=int(s_time.val/win_value)
ax[0].cla()
heatmap=ax[0].imshow(M_list[i-1*1],vmin=0, vmax=1, cmap='coolwarm', aspect='auto')
ax[0].set_xticks(range(len(labels)))
ax[0].set_xticklabels(labels,fontsize=10,)
ax[0].set_yticks(range(len(labels)))
ax[0].set_yticklabels(labels,fontsize=10)
ax0_divider = make_axes_locatable(ax[0])
cax0 = ax0_divider.append_axes('right', size='7%', pad='2%')
cb = fig.colorbar(heatmap, cax=cax0, orientation='vertical')
ax[1].cla()
ax[1].bar(labels,bar_list[i-1])
ax[1].set_ylim(0, 1)
plt.show()
s_time.on_changed(update_graph)
s_time.set_val(0)
labels=['a','b','c','d','e','f','g','h']
Nc=8
Nt=10
M_list=[np.random.rand(Nc,Nc) for i in range(Nt)]
bar_list=[[random.uniform(0,1) for i in range(Nc)] for t in range(Nt)]
win_value=.25
heatmap_barplot_animation(labels,M_list,bar_list,win_value)
輸出給出(在第 3 幀):

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/394397.html
標籤:Python matplotlib
上一篇:如何在matplotlib中使用“雙重科學”符號(~1e-9-4.999e-1)理解這個數字
下一篇:Python排序可視化
