在动画中将 set_xticks 和 set_xticklabels 放在哪里以便正确标记而不会“闪烁”?

Posted

技术标签:

【中文标题】在动画中将 set_xticks 和 set_xticklabels 放在哪里以便正确标记而不会“闪烁”?【英文标题】:Where to put set_xticks and set_xticklabels in animation so as to label correctly without "flickering?" 【发布时间】:2022-01-02 02:09:05 【问题描述】:

Mac 上的 Python 3.9 和 OS 11.6.1

我正在使用Managing dynamic plotting in matplotlib Animation module 中定义的 Player 类来设计一个函数,该函数创建一个动画,该动画将放置在顶层窗口中包含的 tkinter 画布上。动画的每一帧都包含一个出现在相应条形图上方的热图。热图旁边会出现一个颜色条。热图轴标签是存储在通道中的字符串。

这是我的函数,其中 root 是我的主 tkinter 窗口,轴标签存储在 channelsM_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 而不是通道中的条目。

所以,我正在努力正确标记轴并消除闪烁。

【问题讨论】:

【参考方案1】:

我通过不尝试设置所有ax[0] 属性而只是将xticklabels=channels, yticklabels=channels 作为选项添加到sns.heatmap 来解决了这个问题。我仍然不确定如何旋转我的 y 轴标签而不会遇到闪烁。似乎在热图引入某种闪烁之后修改了任何轴属性。

【讨论】:

以上是关于在动画中将 set_xticks 和 set_xticklabels 放在哪里以便正确标记而不会“闪烁”?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在反应原生版本 .61 中将动画添加到底部选项卡图标

如何在 Python 中将动画 .gif 转换为 .webm 格式?

如何在 CSS 中将所有动画设置为“取消动画”?

在 MATLAB 中将动画变形另存为 GIF 文件

在 SwiftUI 中将视图添加到层​​次结构时如何动画过渡

如何在 Flutter 中将按钮图标更改为动画文本?