Python Seaborn聚类热图(clustermap)列颜色显示异常问题
解决列聚类可视化中颜色与标签不匹配的问题
我来帮你搞定这个颜色对应不上的问题!你遇到的核心问题是颜色序列和列标签的对应关系没处理正确,再加上代码里的小拼写失误,咱们一步步修正:
问题分析
你的代码里有两个关键问题:
col_colors=pd.DataFrame(labe...是拼写错误,应该是labels,但就算补全,直接用DataFrame作为col_colors参数也不符合seaborn的要求;- 颜色序列需要和数据列的顺序严格对应,而不是直接用原始的
labels数组(虽然这里列名就是labels,但生成颜色列表时要明确按列的顺序映射)。
修正后的完整代码
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 生成模拟数据 data = pd.DataFrame(np.random.normal(0, 1, [100, 100])) labels = np.repeat([0, 1, 2, 3], [25, 25, 25, 25], axis=0) data.columns = labels # 将列名设置为对应的标签 # 创建标签到颜色的映射字典 lut = dict(zip(set(labels), sns.mpl_palette("autumn", len(set(labels))))) # 关键步骤:按数据列的顺序生成对应的颜色列表 col_colors = [lut[label] for label in data.columns] # 绘制带列颜色标注的聚类热图 g = sns.clustermap(data, col_colors=col_colors, cmap="viridis") # 可选:添加标签-颜色对应图例,方便查看 from matplotlib.patches import Patch legend_elements = [Patch(facecolor=lut[label], label=f"Label {label}") for label in lut] plt.legend(handles=legend_elements, bbox_to_anchor=(1.05, 1), loc='upper left') plt.show()
为什么这样能解决问题?
col_colors参数需要接收一个和列数长度一致的序列(列表/数组/Series),每个元素对应一列的颜色。我们通过[lut[label] for label in data.columns],严格按照每一列的标签从映射字典里取颜色,保证了颜色和列标签的一一对应;- seaborn的
clustermap在对列进行聚类排序时,会自动将col_colors和列的顺序同步调整,所以聚类后每一列的颜色依然和它的原始标签匹配。
内容的提问来源于stack exchange,提问作者Yury Nazarov
相关产品推荐
相关产品推荐

