Где поместить set_xticks и set_xticklabels в анимацию, чтобы правильно помечать без "мерцания"?

0

Вопрос

Python 3.9 на Mac с ОС 11.6.1

Я использую класс Player, определенный при управлении динамическим построением в модуле анимации matplotlib, для разработки функции, которая создает анимацию, которая будет размещена на холсте tkinter, содержащемся в окне верхнего уровня. Каждый кадр анимации состоит из тепловой карты, появляющейся над соответствующей полосой. Рядом с тепловой картой появится цветовая панель. Метки оси тепловой карты представляют собой строки, хранящиеся в каналах.

Вот моя функция, где root-мое главное окно tkinter, метки осей хранятся в channels, M_list представляет собой список матриц, и bar_list представляет собой список списков, где каждый список в bar_list имеет длину, равную количеству каналов и bar_list сама по себе имеет длину, равную числу матриц.

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)

Пример реализации для 50 матриц 8 на 8:

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)

Оси помечены правильно, но метки раздражающе мерцают по мере воспроизведения анимации.

С другой стороны, если я перемещу четыре строки, в которых я устанавливаю метки ax[0] (тепловая карта) вне функции обновления и непосредственно под ней результирующая анимация не мерцает, но метки осей тепловых карт-это числа 0,1,..., 7,а не записи в каналах.

Итак, я изо всех сил пытаюсь правильно обозначить оси И устранить мерцание.

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

Лучший ответ

0

Я решил проблему, не пытаясь установить все ax[0] свойства и просто добавление xticklabels=channels, yticklabels=channels в качестве вариантов sns.heatmap. Однако я все еще не уверен, как поворачивать метки по оси y, не сталкиваясь с мерцанием. Похоже, что любое свойство оси изменяется после того, как тепловая карта вводит какое-то мерцание.

2021-11-23 17:49:51

На других языках

Эта страница на других языках

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