Python 3.9 en Mac con OS 11.6.1
Estoy usando el Reproductor de clase definida en la Gestión dinámica de trazado en matplotlib Animación módulo para el diseño de una función, lo que crea una animación que será colocado en una tkinter lienzo contenida en una ventana Principal. Cada fotograma de la animación consiste en un "mapa de calor" que aparecen por encima de una barra correspondiente parcela. Un colorbar aparece junto al "mapa de calor". El heatmap las etiquetas de eje son las cadenas almacenadas en los canales.
Aquí está mi función, donde la raíz es mi principal tkinter ventana, las etiquetas de eje son almacenados en channels
, M_list
es una lista de las matrices, y bar_list
es una lista de listas, donde cada una de las listas bar_list
tiene una longitud igual al número de canales y bar_list
sí tiene una longitud igual al número de matrices.
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)
Implementación de muestra de 50 de 8 por 8 matrices:
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)
Los ejes están etiquetados correctamente, pero las etiquetas de parpadeo en un molesto manera como se reproduce la animación a cabo.
Por otro lado, si puedo mover las cuatro líneas donde me puse las etiquetas de ax[0]
(el "mapa de calor") fuera de la función de actualización e inmediatamente debajo de ella, la animación resultante no parpadear, pero el heatmap etiquetas de los ejes, son los números 0,1,...,7 y no a las entradas de los canales.
Así que, estoy luchando por la etiqueta de los ejes correctamente Y para eliminar el parpadeo.