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

无法用sns.heatmap复现sns.clustermap热图及行颜色匹配问题

解决Seaborn Clustermap与手动Heatmap复现不一致的问题

问题本质

你遇到的两个问题核心是对Seaborn Clustermap的内部逻辑理解偏差:

  1. 行颜色顺序错位:Clustermap的row_colors参数绑定的是数据原始行索引,而非聚类后的树状图叶子顺序,即便R["leaves"]与g.dendrogram_row.reordered_ind一致,颜色也不会自动跟随聚类排序。
  2. 热图无法复现:默认情况下Clustermap会同时对行和列做聚类(除非显式关闭列聚类),仅用行的reordered_ind排序矩阵会忽略列的聚类结果;此外,Clustermap的颜色标度、数据标准化等参数需与手动Heatmap完全对齐。

针对性解决方案

问题1:修正行颜色顺序

将行颜色列表按照树状图的叶子顺序(即g.dendrogram_row.reordered_ind)重新排序后,再传入row_colors参数。

问题2:准确复现Clustermap热图

  • 同时使用行和列的reordered_ind对矩阵做双重排序
  • 确保Heatmap的颜色映射(cmap)、颜色范围(vmin/vmax)、数据标准化方式与Clustermap完全匹配

完整修正代码示例

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage

# 生成模拟数据
np.random.seed(42)
corr = np.random.rand(10, 10)
corr = (corr + corr.T) / 2  # 转为对称矩阵
np.fill_diagonal(corr, 1)

# 生成链接矩阵Z
Z = linkage(corr, method='ward')

# 绘制Clustermap并获取聚类结果
g = sns.clustermap(
    corr,
    row_linkage=Z,
    col_linkage=Z,  # 保持行列聚类逻辑一致
    cmap='coolwarm',
    vmin=0, vmax=1
)

# 问题1:修正行颜色
original_row_colors = ['red']*3 + ['blue']*4 + ['green']*3  # 模拟原始颜色列表
# 按聚类后的叶子顺序重新排序颜色
reordered_row_colors = [original_row_colors[i] for i in g.dendrogram_row.reordered_ind]

# 重新绘制带正确行颜色的Clustermap
g_fixed = sns.clustermap(
    corr,
    row_linkage=Z,
    col_linkage=Z,
    row_colors=reordered_row_colors,
    cmap='coolwarm',
    vmin=0, vmax=1
)

# 问题2:用Heatmap复现Clustermap效果
row_order = g.dendrogram_row.reordered_ind
col_order = g.dendrogram_col.reordered_ind
# 对矩阵做行+列的双重排序
corr_reordered = corr[np.ix_(row_order, col_order)]

# 绘制复现的Heatmap
plt.figure(figsize=(8,8))
sns.heatmap(
    corr_reordered,
    cmap='coolwarm',
    vmin=0, vmax=1,
    xticklabels=np.array(g.data.columns)[col_order],
    yticklabels=np.array(g.data.index)[row_order]
)
plt.title('Heatmap复现Clustermap效果')
plt.show()

补充说明

  • 若不需要列聚类,需在Clustermap中指定col_cluster=False,此时手动排序仅需使用行的reordered_ind
  • 若Clustermap使用了z_score参数(如z_score=0对行标准化),手动Heatmap前需对数据执行相同的标准化操作:corr_scaled = scipy.stats.zscore(corr, axis=0),再排序绘制

内容的提问来源于stack exchange,提问作者athantas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:24:59