Seaborn聚类热图设置:等值绝对值对应同一颜色
实现聚类热图中绝对值相等值同色的方案
针对你需要的“相关性正负无关,仅关注偏离0的程度,绝对值相等值显示同一颜色”的需求,这里提供两种实用实现方式:
方式一:聚类基于原始相关性,热图颜色基于绝对值
适合需要保留原始相关性正负用于聚类,但视觉上只突出强度的场景:
- 导入依赖库
import seaborn as sns import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import Normalize
- 自定义归一化器
这个归一化器会把正负值转换成对应的绝对值,实现同绝对值同颜色映射:
class SymmetricAbsNorm(Normalize): def __call__(self, value, clip=None): abs_val = np.abs(value) return super().__call__(abs_val, clip=clip)
- 生成/加载相关性数据并绘制聚类热图
# 示例:生成随机相关性矩阵(替换为你的真实数据) corr = np.corrcoef(np.random.randn(10, 10)) # 创建对称颜色映射:中心为浅色,正负方向使用同一深色渐变 cmap = sns.diverging_palette(255, 255, s=75, l=50, center="light", as_cmap=True) # 初始化自定义归一化器,范围0-1对应绝对值0-1 norm = SymmetricAbsNorm(vmin=0, vmax=1) # 绘制聚类热图,聚类逻辑基于原始相关性 g = sns.clustermap(corr, cmap=cmap, norm=norm) # 调整颜色条刻度,显示正负对应关系 g.cax.set_yticks([0, 0.25, 0.5, 0.75, 1]) g.cax.set_yticklabels(["-1", "-0.75", "-0.5", "-0.25", "0", "0.25", "0.5", "0.75", "1"]) g.cax.set_ylim(0, 1) plt.show()
方式二:聚类和热图均基于绝对值
完全契合“正负无关紧要”的需求,聚类和视觉呈现都只关注相关性强度:
- 导入依赖库
import seaborn as sns import matplotlib.pyplot as plt import numpy as np
- 处理数据并绘制
# 示例:生成随机相关性矩阵(替换为你的真实数据) corr = np.corrcoef(np.random.randn(10, 10)) # 取相关性的绝对值 corr_abs = np.abs(corr) # 创建从浅到深的颜色映射,中心为0(浅色),强度越高颜色越深 cmap = sns.light_palette("darkred", as_cmap=True) # 绘制聚类热图,聚类逻辑基于相关性强度(绝对值) g = sns.clustermap(corr_abs, cmap=cmap, vmin=0, vmax=1) # 修改颜色条刻度,明确标注正负对应数值 g.cax.set_yticks([0, 0.25, 0.5, 0.75, 1]) g.cax.set_yticklabels(["0", "±0.25", "±0.5", "±0.75", "±1"]) plt.show()
关键说明
- 颜色映射可根据喜好替换:比如把
darkred换成navy、purple等,或用sns.diverging_palette调整色调、饱和度 - 若你的相关性范围不是[-1,1],只需修改
vmin和vmax参数即可适配
内容的提问来源于stack exchange,提问作者Luis_12345
相关产品推荐
相关产品推荐

