seaborn热图动画嵌入tkinter后无法正确显示自定义刻度标签
问题原因
你在动画更新函数update_matrix的开头调用了ax.cla()清空坐标轴,这会直接清除你在函数外部预先设置的坐标轴刻度、标签等所有属性。而seaborn.heatmap默认会使用矩阵的数值索引作为坐标轴标签,所以每帧刷新后都会恢复显示0、1、2、3。
修正方案
推荐直接在sns.heatmap参数中指定刻度标签,逻辑更简洁无需重复设置:
- 给
sns.heatmap新增xticklabels和yticklabels参数,直接传入通道标签列表 - 额外补充动画对象引用绑定逻辑,避免Python垃圾回收机制销毁动画对象导致播放中断
修改后的完整可运行代码如下:
import numpy as np import tkinter as tk from tkinter import Tk, Toplevel, TOP, BOTH from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from mpl_toolkits.axes_grid1 import make_axes_locatable import seaborn as sns # 此处为你提前定义好的Player类 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) ax=fig.add_subplot(111) # 颜色条仅需初始化一次,无需每帧重建 divider = make_axes_locatable(ax) cbar_ax = divider.append_axes("right", size="5%", pad=0.05) def update_matrix(i): ax.cla() # 直接在heatmap参数中指定通道标签 sns.heatmap(ax = ax, data = M_list[i], cmap = "coolwarm", cbar_ax = cbar_ax, vmin=0, vmax=1, xticklabels=channels, yticklabels=channels) # 创建动画并绑定到窗口属性,避免被垃圾回收 ani = Player(fig, update_matrix, maxi=num_times) plot_window.ani = ani # 测试调用 if __name__ == "__main__": M_list=[np.random.rand(4,4) for i in range(50)] channels=['a','b','c','d'] root=tk.Tk() root.geometry('1000x1000') animate_coherence_matrices(root,channels,M_list) root.mainloop()
内容的提问来源于stack exchange,提问作者fishbacp
相关产品推荐
相关产品推荐

