Dove mettere set_xticks e set_xticklabels in animazione modo per etichettare correttamente senza flickering?"

0

Domanda

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.

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

Migliore risposta

0

Ho risolto il problema, non cercando di impostare tutti i ax[0] proprietà e solo l'aggiunta di xticklabels=channels, yticklabels=channels come opzioni di sns.heatmap. Non sono ancora sicuro di come ruotare il mio etichette dell'asse y senza incontrare sfarfallio però. Sembra come ogni asse proprietà modificato dopo heatmap introduce sfarfallio di qualche tipo.

2021-11-23 17:49:51

In altre lingue

Questa pagina è in altre lingue

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