heatmap()画不出相关系数矩阵主因是数据含非数值列,需用select_dtypes筛选数值列或编码分类变量;颜色条、标签、保存等细节需分别用cbar_kws、xticklabels、fig.savefig等精准控制。

heatmap() 画不出相关系数矩阵?先检查数据类型
直接传 df.corr() 结果进 heatmap() 看似合理,但常因数据含非数值列(如字符串 ID、时间戳)导致 corr() 返回空 DataFrame 或报错 TypeError: unsupported operand type(s) for /: 'str' and 'float'。
- 用
df.select_dtypes(include=['number'])显式筛出数值列再算相关性 - 若含分类变量且想编码后参与计算,得先用
pd.get_dummies()或LabelEncoder转换,不能直接喂给corr() -
corr(method='spearman')对异常值更鲁棒,但计算慢;默认'pearson'要求线性假设
颜色条(colorbar)位置偏移或文字糊成一片?控制 cbar_kws 和字体大小
默认 colorbar 标签和刻度常挤在一起,尤其当相关系数范围窄(比如集中在 0.8–0.99)时,heatmap() 自动缩放会放大微小差异,让视觉失真。
- 加
cbar_kws={'shrink': 0.8, 'aspect': 20}缩小 colorbar 宽度,拉长高度,避免标签重叠 - 用
annot=True显示数值时,务必配fmt='.2f'(别用'.2g',否则 0.005 变成 0.0050 → 0.005 → 0.00,精度丢失) - 中文环境记得提前设
plt.rcParams['font.sans-serif'] = ['SimHei'],否则热力图里汉字变方块
行列标签太长,热力图被压缩变形?用 xticklabels 和 yticklabels 控制显示粒度
原始列名如 'user_login_time_last_7d_mean' 直接当 xticklabel,图一画出来就糊成黑带,且整个 figure 横向撑爆。
- 传入
xticklabels=[x[:12] + '...' if len(x) > 12 else x for x in df.columns]截断过长标签 - 用
plt.xticks(rotation=45)后接plt.tight_layout(),否则旋转后标签被裁掉 - 若只关心上三角部分(相关矩阵对称),用
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))配mask=mask参数隐藏下三角,减少干扰
保存图片模糊或白边过大?绕开 plt.show() 直接 fig.savefig()
调完图用 plt.show() 再截图,分辨率低、边缘留白不可控,尤其嵌入报告时难看。
立即学习“Python免费学习笔记(深入)”;
- 创建 figure 时显式指定尺寸:
plt.figure(figsize=(10, 8)),比默认 dpi 更稳 - 保存用
fig = plt.gcf(); fig.savefig('corr_heatmap.png', bbox_inches='tight', dpi=300),bbox_inches='tight'自动裁白边 - 导出 PDF 用于论文?把
dpi=300换成format='pdf'即可,矢量图无损缩放
真正麻烦的是 mask 和 annot 同时开启时的对齐问题——mask 会跳过某些格子的 annot 渲染,但字体大小、颜色、位置参数仍全局生效,容易出现“空格有字、有格无字”的错觉。这时候得手动遍历 ax.text() 补位,不是改几个参数能解决的。










