Donde poner set_xticks y set_xticklabels en la animación, así como para etiquetar correctamente sin parpadeo?"

0

Pregunta

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.

animation matplotlib python tkinter
2021-11-23 15:14:49
1

Mejor respuesta

0

He resuelto el problema, tratando de establecer todos los ax[0] propiedades y sólo la adición de xticklabels=channels, yticklabels=channels como opciones para sns.heatmap. Todavía no estoy seguro de cómo rotar mis etiquetas del eje y sin encontrar el parpadeo, aunque. Parece como cualquier eje de propiedad modificado después de "mapa de calor" introduce el parpadeo de algún tipo.

2021-11-23 17:49:51

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................