如何在Seaborn热力图对角线上添加变量标签?实现类似R语言ggcorr包的三角相关矩阵标签样式
在Seaborn热力图对角线上添加内部变量标签(模拟ggcorr样式)
没问题,我们可以通过手动在热力图的坐标轴上绘制文本标签来实现这个需求,完美模拟R语言ggcorr包的三角相关矩阵内部对角线标签样式——把变量标签放在图表内部的对角线上,替代Seaborn默认的侧边刻度。
核心思路
Seaborn默认的刻度标签在图表侧边,要实现内部对角线标签,我们需要:
- 关闭侧边的x、y轴刻度标签
- 获取变量名称列表,遍历每个对角线位置
- 在每个对角线单元格的中心位置手动绘制文本标签
修改后的完整代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np # 加载数据集 df = pd.read_csv('http://datasets.flowingdata.com/ppg2008.csv') # 计算相关系数矩阵 corr = df.corr() # 创建上三角掩码(k=0包含对角线,若想隐藏对角线可设k=1) mask = np.triu(np.ones_like(corr), k=0).astype(bool) plt.figure(figsize=(10,10)) g = sns.heatmap( corr, mask=mask, square=True, # 必须设置为正方形,保证标签位置准确 xticklabels=False, # 关闭顶部x轴标签 yticklabels=False, # 关闭左侧y轴标签 linewidths=0.5, cmap="vlag", vmin=-1, vmax=1, cbar_kws={'shrink': 0.6, 'label': 'correlation', 'aspect':15} ) # 翻转X轴,让上三角矩阵显示在右上角(和ggcorr的布局一致) g.invert_xaxis() # 获取所有变量的名称 labels = corr.columns.tolist() n_vars = len(labels) # 在对角线上逐个添加内部标签 for i in range(n_vars): # 对角线单元格的中心坐标:热力图坐标轴范围是0到变量数,每个单元格占1单位,中心为i+0.5 g.text( x=i + 0.5, y=i + 0.5, s=labels[i], ha='center', # 水平居中对齐 va='center', # 垂直居中对齐 fontsize=10, color='black' # 可根据对角线单元格的背景色调整,比如深色背景用白色 ) plt.tight_layout() plt.show()
关键细节说明
square=True是必须的:只有正方形的热力图,每个单元格的宽高才相等,标签才能准确落在对角线单元格的中心- 标签坐标计算:热力图的Axes坐标轴范围是从0到变量总数,每个单元格对应1个单位长度,所以第i个变量的对角线单元格中心坐标是
(i+0.5, i+0.5) - 样式调整:可以根据需求修改
fontsize、color,如果变量名太长,还可以添加rotation=45让标签倾斜,避免重叠 - 下三角矩阵适配:如果想要下三角布局,只需要把
mask改成np.tril(np.ones_like(corr), k=0).astype(bool),并且去掉g.invert_xaxis()即可
内容的提问来源于stack exchange,提问作者My Work
相关产品推荐
相关产品推荐

