You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Seaborn聚类热图(clustermap)列颜色显示异常问题

解决列聚类可视化中颜色与标签不匹配的问题

我来帮你搞定这个颜色对应不上的问题!你遇到的核心问题是颜色序列和列标签的对应关系没处理正确,再加上代码里的小拼写失误,咱们一步步修正:

问题分析

你的代码里有两个关键问题:

  1. col_colors=pd.DataFrame(labe...是拼写错误,应该是labels,但就算补全,直接用DataFrame作为col_colors参数也不符合seaborn的要求;
  2. 颜色序列需要和数据列的顺序严格对应,而不是直接用原始的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:56:03