直接用pandas.DataFrame.corr()计算相关系数后传给seaborn.heatmap()易出错或显示混乱,因默认不显示数值、标签错位、不处理NaN及中文/长列名;需设annot=True、fmt='.2f'、xticklabels=True、yticklabels=True和cmap='coolwarm',并配合plt.xticks(rotation=45)等调整布局。

直接用 pandas.DataFrame.corr() 算相关系数,再喂给 seaborn.heatmap() 就能出图——但默认设置下容易糊成一片、标签错位、数值不显示,甚至报 TypeError: 'numpy.float64' object is not iterable。
为什么 corr() 后直接传给 heatmap() 会出错或难看
常见错误是把 corr() 结果(DataFrame)当成数值矩阵直接塞进去,却忘了 seaborn.heatmap() 默认不显示数字、不自动旋转 x/y 标签、也不处理 NaN —— 尤其当列名含空格或中文时,x 轴标签常重叠挤在一起。
-
corr()返回的是带行列索引的 DataFrame,不是纯二维数组,但heatmap()能接,无需转.values(强行转反而丢掉标签) - 若数据含非数值列(如字符串 ID、日期),
corr()默认跳过,但不会报错;建议先select_dtypes(include='number')显式过滤 - 缺失值多时,
corr(method='pearson')默认用 pairwise deletion,结果可能不一致;可加min_periods=10控制最小有效配对数
画出清晰可读热力图的 4 个关键参数
不用改数据、不写循环,靠这四个参数就能解决 90% 的显示问题:
-
annot=True:让每个格子显示相关系数值(否则只靠颜色判断很吃力) -
fmt='.2f':控制小数位数,避免显示0.999999999这类浮点误差 -
xticklabels=True, yticklabels=True:显式开启标签(某些 seaborn 版本默认关) -
cmap='coolwarm':比默认'viridis'更适合相关性(正负分明,中间白/浅色表示接近 0)
示例代码:
立即学习“Python免费学习笔记(深入)”;
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt <h1>假设 df 是你的原始 DataFrame</h1><p>corr_matrix = df.select_dtypes(include='number').corr() sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm', xticklabels=True, yticklabels=True) plt.show()
中文列名、长列名导致标签重叠怎么办
热力图里中文列名默认竖排、挤成一条线,根本看不清。这不是数据问题,是绘图后没调整坐标轴属性。
- 在
plt.show()前加plt.xticks(rotation=45, ha='right')和plt.yticks(rotation=0) - 如果仍换行或截断,用
plt.tight_layout()重排布局(必须放在plt.show()前) - 极端情况(比如 50+ 变量),别硬塞全名,改用
corr_matrix.rename(columns=lambda x: x[:8] + '…' if len(x) > 10 else x)截断列名
想高亮强相关(|r| > 0.7)或屏蔽对角线怎么办
相关系数矩阵主对角线恒为 1,遮掉更清爽;另外,业务上往往只关心强相关组合。
- 遮对角线:用
np.fill_diagonal(corr_matrix.values, np.nan)(注意是.values,不是整个 DataFrame) - 只标强相关:传入
mask=abs(corr_matrix) 给 <code>heatmap(),被 mask 的区域变空白(需配合cmap设置na_color) - 注意
mask必须是布尔矩阵,形状与corr_matrix完全一致;别用corr_matrix > 0.7,那只会保留正强相关,漏掉负的
真正容易被忽略的是:mask 会同时影响颜色渲染和 annot 显示——被 mask 的格子,即使设了 annot=True 也不会打数字。


















