Seaborn Heatmap相关系数标注数字无法适配单元格问题咨询
解决方法
你遇到的标注无法适配单元格的核心原因是长轴标签占用了过多的画布空间,导致热图本身的绘制区域被压缩,单元格尺寸太小无法容纳默认大小的标注文字,可以通过以下几个方案组合解决:
- 缩小标注文字的字号
通过sns.heatmap的annot_kws参数直接设置标注数字的大小,改小字号即可适配更小的单元格:
sns_plot = sns.heatmap(correlation_matrix, mask=mask, annot=True, fmt='.2f', square=True, # 新增以下参数,按需调整字号大小 annot_kws={"size": 7})
- 优化轴标签的显示,释放热图绘图空间
你当前的列标签最长达到50个字符,横向摆放会占用大量底部空间,挤压热图的实际绘制区域,导致单元格被压缩。可以调整轴标签的旋转角度、边距,给热图留出更多空间:
# 绘制热图后补充以下代码 ax.set_xticklabels(ax.get_xticklabels(), rotation=90, fontsize=8) ax.set_yticklabels(ax.get_yticklabels(), rotation=0, fontsize=8) # 调整画布边距,给长标签预留足够空间 f.subplots_adjust(left=0.35, bottom=0.45)
- 调整画布尺寸的宽高比
你当前设置的figsize=(30,15)宽高比为2:1,配合square=True(强制单元格为正方形)时,会自动限制热图的高度为短边长度,导致单元格整体偏小。可以把高度调大,比如改成figsize=(30,30),让热图有足够的纵向空间放大单元格。
如果不需要严格的正方形单元格,也可以关闭square=True,同时设置aspect参数调整单元格宽高比:
sns_plot = sns.heatmap(correlation_matrix, mask=mask, annot=True, fmt='.2f', square=False, # 新增以下参数,按需调整单元格宽高比 aspect=0.8)
修改后完整示例代码
import seaborn as sns import numpy as np import pandas as pd import matplotlib.pyplot as plt # Generate a dummy df df = pd.DataFrame(np.random.rand(44,44)) label_lens = [16, 16, 16, 16, 16, 16, 16, 16, 20, 11, 9, 10, 10, 16, 16, 16, 16, 12, 45, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50] col_labels = [] for label_len in label_lens: col_labels.append('X'*label_len) df.columns = col_labels # Build correlation matrix df correlation_matrix = df.corr() # Get Diagonal Mask. Square matrix is not relevant. mask = np.triu(np.ones_like(correlation_matrix, dtype=bool)) # 调整画布宽高比,增大高度给热图预留空间 f, ax = plt.subplots(figsize=(30, 30)) # Draw the heatmap with the mask and correct aspect ratio sns_plot = sns.heatmap(correlation_matrix, mask=mask, annot=True, fmt='.2f', square=True, annot_kws={"size": 7}) # 调整轴标签格式 ax.set_xticklabels(ax.get_xticklabels(), rotation=90, fontsize=8) ax.set_yticklabels(ax.get_yticklabels(), rotation=0, fontsize=8) # 调整边距 f.subplots_adjust(left=0.35, bottom=0.45) f.savefig("my_corr_matrix.pdf")
内容的提问来源于stack exchange,提问作者Matheus Torquato
相关产品推荐
相关产品推荐

