【问题标题】:Unable to correctly label tickmarks in seaborn heatplot animation无法在 seaborn 热图动画中正确标记刻度线
【发布时间】:2021-10-27 11:35:41
【问题描述】:

我有一个由 100 个 4×4 相干矩阵组成的序列,我希望使用 seaborn 对其热图进行动画处理。四行/列对应于通道'a''b''c''d',动画序列将嵌入到出现在Toplevel窗口中的tkinter图形画布上。

我正在使用方便的Player 类定义Managing dynamic plotting in matplotlib Animation module,它创建带有播放按钮的动画。

我希望将所有这些组合成一个函数,该函数将主 tkinter 窗口名称、通道标签和矩阵列表作为其输入,其输出是所需的动画。相关代码:

M_list=[np.random.rand(4,4) for i in range(50)]
channels=['a','b','c','d']

root=Tk()
root.geometry('1000x1000')

def animate_coherence_matrices(root,channels,M_list):
    num_times=len(M_list)-1
    fig=Figure()
    plot_window = Toplevel(bg="lightgray")
    plot_window.geometry('700x700')

    canvas = FigureCanvasTkAgg(fig, master=plot_window)
    canvas.draw()
    canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=1)


    def update_matrix(i):
        # clear current axes
        ax.cla()
        sns.heatmap(ax = ax, data = M_list[i], cmap = "coolwarm", cbar_ax = 
        cbar_ax,vmin=0,vmax=1)


    ax=fig.add_subplot(111)
    # set up axes labels OUTSIDE update function so we don't need to re-create for 
    # each frame. 
    ax.set_xticks(range(len(channels)))
    ax.set_xticklabels(channels,fontsize=10)
    ax.set_yticks(range(len(channels)))
    ax.set_yticklabels(channels,fontsize=10)

    # create heatmap color bar
    divider = make_axes_locatable(ax)
    cbar_ax = divider.append_axes("right", size="5%", pad=0.05)

    # Create animation with buttons as described at URL above.
    ani = Player(fig, update_matrix, maxi=num_times)


animate_coherence_matrices(root,channels,M_list)

root.mainloop()

这一切都很好,花花公子,除了每帧中的轴标签是0123,而不是通道标签'a''b''c''d'.

显然我忽略了一些很容易纠正的东西。

【问题讨论】:

    标签: python matplotlib animation plot seaborn


    【解决方案1】:

    只需移动线条:

    ax.set_xticks(range(len(channels)))
    ax.set_xticklabels(channels, fontsize = 10)
    ax.set_yticks(range(len(channels)))
    ax.set_yticklabels(channels, fontsize = 10)
    

    在函数update_matrix内:

    def update_matrix(i):
        # clear current axes
        ax.cla()
        sns.heatmap(ax = ax, data = M_list[i], cmap = "coolwarm", cbar_ax = 
        cbar_ax,vmin=0,vmax=1)
        ax.set_xticks(range(len(channels)))
        ax.set_xticklabels(channels, fontsize = 10)
        ax.set_yticks(range(len(channels)))
        ax.set_yticklabels(channels, fontsize = 10)
    


    如果您将标签与热图单元格对齐,只需评论 ax.set_xticksax.set_yticks 行:

    def update_matrix(i):
        # clear current axes
        ax.cla()
        sns.heatmap(ax = ax, data = M_list[i], cmap = "coolwarm", cbar_ax = 
        cbar_ax,vmin=0,vmax=1)
        # ax.set_xticks(range(len(channels)))
        ax.set_xticklabels(channels, fontsize = 10)
        # ax.set_yticks(range(len(channels)))
        ax.set_yticklabels(channels, fontsize = 10)
    

    【讨论】:

    • 谢谢,我在上面尝试过您的建议,但不知何故,我的标签在帧与帧之间“闪烁”,并且不像在动画中那样固定。 (运行 Big Sur 的 Mac 上的 Python 3.9。)
    猜你喜欢
    • 2021-12-20
    • 2017-04-05
    • 2021-04-17
    • 2015-01-18
    • 2019-08-25
    • 2020-06-15
    • 2018-05-26
    • 1970-01-01
    相关资源
    最近更新 更多