Onde colocar set_xticks e set_xticklabels em animação, de modo a etiqueta corretamente sem "vacilante?"

0

Pergunta

Python 3.9 no Mac com o OS 11.6.1

Eu estou usando o Leitor de classe definida no Gerenciamento dinâmico de plotagem em matplotlib de Animação de módulo para o projeto de uma função, o que cria uma animação que vai ser colocado em um tkinter lona contidos em uma janela de nível superior. Cada quadro da animação consiste de um mapa de calor que aparecem em cima de uma barra correspondente a trama. Um colorbar aparece ao lado o mapa de calor. O heatmap rótulos do eixo são strings armazenadas em canais.

Aqui é a minha função, onde root é a minha principal tkinter janela, rótulos do eixo são armazenados em channels, M_list é uma lista de matrizes e bar_list é uma lista de listas, onde cada lista no bar_list tem comprimento igual ao número de canais e bar_list si tem comprimento igual ao número de matrizes.

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)

Exemplo de implementação para 50 8-por-8 matrizes:

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)

Os eixos são rotulados, mas os rótulos de cintilação em um chato forma como a animação joga fora.

Por outro lado, se eu mover as quatro linhas, onde eu definir os rótulos de ax[0] (o mapa de calor), fora a função de atualização e, imediatamente abaixo, a resultante de animação não tremer, mas o heatmap as etiquetas dos eixos são os números 0,1,...,7 e não as entradas dos canais.

Então, eu estou lutando para rotular os eixos corretamente E para eliminar a cintilação.

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

Melhor resposta

0

Eu resolvi o problema por não tentar definir todos os ax[0] propriedades e adicionando xticklabels=channels, yticklabels=channels como opções para sns.heatmap. Ainda não tenho certeza de como rodar meus rótulos do eixo y sem a ocorrência de cintilação embora. Parece como qualquer eixo propriedade modificada depois de heatmap introduz a cintilação de algum tipo.

2021-11-23 17:49:51

Em outros idiomas

Esta página está em outros idiomas

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