Python 3.9 su Mac con OS 11.6.1
Sto usando la classe del Giocatore definito a Gestione dinamica tramando nell'matplotlib Animazione modulo per la progettazione di una funzione, che crea un'animazione che sarà collocato su un tkinter tela, contenuto in una finestra Principale. Ogni fotogramma dell'animazione consiste in una heatmap che appaiono al di sopra di una corrispondente grafico a barre. Un file viene visualizzato accanto al heatmap. La heatmap etichette dell'asse stringhe memorizzate nei canali.
Ecco la mia funzione, dove la radice è la mia principale tkinter finestra, le etichette dell'asse vengono memorizzati in channels
, M_list
è un elenco di matrici, e bar_list
è una lista di liste, in cui ogni lista bar_list
ha lunghezza pari al numero di canali e bar_list
stesso ha lunghezza pari al numero di matrici.
def heatplot_barplot_animation_combined(root,channels,M_list,bar_list):
num_times=len(M_list)-1
fig, ax = plt.subplots(2)
plot_window = Toplevel(root)
canvas = FigureCanvasTkAgg(fig, master=plot_window)
canvas.draw()
canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=1)
def update_graph(i):
ax[0].cla
cbar_ax.cla()
sns.heatmap(ax = ax[0], data = M_list[i], cmap = "coolwarm", cbar_ax =
cbar_ax,vmin=0,vmax=1)
ax[0].set_xticks(range(len(channels)))
ax[0].set_xticklabels(channels,fontsize=10)
ax[0].set_yticks(range(len(channels)))
ax[0].set_yticklabels(channels,fontsize=10)
ax[1].cla()
ax[1].bar(channels,bar_list[i])
ax[1].set_ylim(0, 1)
fig.suptitle('Frame: '+str(i), fontsize=12)
divider = make_axes_locatable(ax[0])
cbar_ax = divider.append_axes("right", size="5%", pad=0.05)
ani = Player(fig, update_graph, maxi=num_times)
Esempio di implementazione per 50 8-by-8 matrici:
channels=['a','b','c','d','e','f','g','i']
Nc=len(channels)
Nt=50
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)]
heatplot_barplot_animation_combined(root,channels,M_list,bar_list)
Gli assi sono etichettati correttamente, ma le etichette del flicker in un modo fastidioso come l'animazione si svolge.
D'altra parte, se sposto le quattro righe in cui ho impostato le etichette di ax[0]
(la heatmap) al di fuori della funzione di aggiornamento e subito sotto di essa, l'animazione risultante non flicker, ma la heatmap le etichette degli assi sono i numeri 0,1,...,7 e non solo le voci canali.
Così, sto cercando di etichettare gli assi correttamente E per eliminare il flickering.