使用seaborn的clustermap做层次聚类时如何遮盖下三角矩阵
seaborn clustermap下三角掩码失效解决方案
失效核心原因
sns.clustermap的mask参数不生效的核心原因是:clustermap默认开启row_cluster和col_cluster参数,会基于层次聚类结果重新调整矩阵的行、列展示顺序,提前生成的下三角掩码是匹配原始未排序的相关系数矩阵的,行列顺序变化后掩码位置和实际矩阵元素无法对应,自然无法达到预期的遮盖效果。
适配不同场景的解决方案
场景1:不需要调整行列顺序
如果不需要聚类重排行列,仅需要保留clustermap的可视化布局,直接关闭行列聚类即可,原有掩码可直接生效:
import numpy as np import seaborn as sns import matplotlib.pyplot as plt corr = np.corrcoef(np.random.randn(10, 200)) mask = np.tril(np.ones_like(corr)) # 关闭行列聚类,行列顺序和原始矩阵完全一致 sns.clustermap(corr, cmap="Blues", mask=mask, figsize=(6,6), row_cluster=False, col_cluster=False) plt.show()
场景2:需要保留聚类重排效果
如果需要保留聚类后的行列排序逻辑,需要先获取clustermap重排后的矩阵,再生成对应下三角掩码应用到热力图上:
import numpy as np import seaborn as sns import matplotlib.pyplot as plt corr = np.corrcoef(np.random.randn(10, 200)) # 先初始化clustermap,暂不传入mask参数 g = sns.clustermap(corr, cmap="Blues", figsize=(6,6)) # 获取聚类重排后的相关系数矩阵 reordered_corr = g.data2d # 生成适配重排后矩阵的下三角掩码 new_mask = np.tril(np.ones_like(reordered_corr)) # 将新掩码应用到热力图图层 g.ax_heatmap.collections[0].set_mask(new_mask) plt.show()
内容的提问来源于stack exchange,提问作者Cactus Philosopher
相关产品推荐
相关产品推荐

