np.triu()遮罩上三角需用布尔型mask,否则全黑;corr必须对称,否则遮罩错位;square=True与中文标签易致渲染偏移,需设字体及匹配尺寸。

用 np.triu() 遮罩上三角时,热力图全黑或空白
常见现象是调用 np.triu(np.ones_like(corr), k=1) 后传给 seaborn.heatmap(mask=...),结果整个图变黑、没数据、或者只显示下三角但边缘模糊。根本原因是:mask 里值为 True 的位置会被隐藏,而 np.triu() 默认返回 1(即非零),不是布尔值 —— seaborn 把所有非零当 True 处理,于是整个上三角连带部分下三角也被误遮。
- 必须显式转成布尔型:
mask = np.triu(np.ones_like(corr, dtype=bool), k=1) - 或用比较操作:
mask = np.triu(np.ones_like(corr), k=1) == 0 -
k=1表示从对角线往上第一行开始遮(保留对角线),若想连对角线一起去掉,用k=0
相关系数矩阵本身不对称导致遮罩错位
如果 corr 是用 pandas.DataFrame.corr() 算的,一般没问题;但若手写协方差/皮尔逊公式、或用了不同缺失值处理方式(比如某列用 dropna,另一列用 mean 填充),corr 可能轻微不对称。这时 np.triu() 按索引遮,实际数值的“上三角”和矩阵结构的“上三角”就错开了,看起来像遮一半漏一半。
- 检查是否对称:
np.allclose(corr, corr.T),不返回True就得重算 - 稳妥做法:用
corr = corr.where(np.tril(np.ones_like(corr, dtype=bool)), np.nan)先把上三角设为nan,再画图(不依赖 mask) - seaborn 0.12+ 对非对称矩阵会报警,但不中断,容易被忽略
seaborn heatmap 的 mask 和 square 参数冲突
当变量名长度差异大(比如列名有 "user_id" 和 "a"),又设了 square=True,seaborn 会强行拉伸单元格,导致 mask 的布尔索引和渲染后的像素位置偏移——看着像是遮罩“歪了”。这不是 np.triu() 的问题,而是绘图层的坐标对齐失效。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 优先关掉
square=True,用figsize手动调宽高比 - 若必须方形,先用
plt.figure(figsize=(8, 7))预设接近 1:1 的尺寸,再传square=True - mask 数组形状必须严格等于
corr.shape,不能是(n, n+1)或含 index 名的 DataFrame 直接传入
中文标签 + np.triu() 遮罩后字体压扁或错行
不是遮罩逻辑的问题,而是 matplotlib 默认字体不支持中文,且未设置 font.sans-serif,导致标签渲染失败后自动缩放变形,进而挤压热力图单元格,让 mask 区域视觉上“溢出”。尤其在 Jupyter 中静默发生,看不出报错。
- 加一行全局设置:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] - 确保
seaborn.heatmap(..., xticklabels=True, yticklabels=True)没被设成False - 如果用了
annot=True,中文数字可能重叠,需同步调annot_kws={'size': 8}
这种遮罩看着简单,真正卡住人的往往是 mask 类型、矩阵对称性、绘图参数三者之间的隐式耦合。特别是当数据来自不同清洗流程、又混用 pandas 和 numpy 计算时,np.triu() 的输出类型和 corr 的 dtype 很容易不一致,得挨个 print shape、dtype、sample values 才能定位。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










