seaborn.heatmap() 默认不显示数值,需设 annot=true;数据须为数值型,nan 或字符串会报错;用 fmt 控制小数位;cbar_kws 调 colorbar 宽度、方向;行列顺序需手动排序;中文需提前配置 matplotlib 字体。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

seaborn.heatmap() 为什么不显示数值?
默认不显示单元格里的数字,这是最常被当成“bug”的地方。要显示数值得手动开开关,而且得注意数据类型——如果传进去的是字符串或带 NaN 的列,annot=True 会直接报错或留空。
- 加
annot=True才显示数字,不加就是纯色块 - 确保传给
data的是数值型 DataFrame(用df.select_dtypes(include='number')过滤最稳) - 如果数值太长(比如相关系数带 6 位小数),加
fmt='.2f'控制精度,否则可能挤满格子 - 中文标签或长列名容易重叠,顺手加
plt.xticks(rotation=45)再plt.tight_layout()
颜色条(colorbar)位置和大小怎么调?
默认 colorbar 贴右边、又细又长,跟图比例不协调,尤其横向宽图里看着特别突兀。它不是独立对象,得通过 cbar_kws 往 heatmap 里塞参数。
- 调宽度:用
cbar_kws={'shrink': 0.6}(0.1–1 之间,值越小 colorbar 越窄) - 调位置:加
cbar_kws={'aspect': 20}可以拉高 colorbar,避免过扁;想放底下就加cbar_kws={'orientation': 'horizontal'} - 别在
cbar_kws里写location或position—— seaborn 不认,会静默忽略
热力图行列顺序总和你想要的不一致
seaborn 默认按 DataFrame 索引和列名的原始顺序画,但你传进去的数据可能是从 groupby 或 corr() 来的,索引乱、顺序反、甚至带重复名。heatmap 不会自动排序,也不会报错,只是照画。
- 先用
df = df.sort_index().sort_index(axis=1)稳住行列顺序 - 如果想按某列相关性从高到低排,得手动重排索引:
corr = df.corr(); corr = corr.loc[corr.index[::-1], corr.columns[::-1]] - 传入
xticklabels或yticklabels时,长度必须和数据行列数严格一致,否则报ValueError: The number of FixedLocator locations (X) does not match the number of tick labels (Y)
中文标题/坐标轴文字显示为方块?
不是豆包AI的问题,是 matplotlib 默认字体不支持中文。seaborn 基于 matplotlib,所以得提前设字体,不能等画完图再改。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
- 在 import seaborn 之前加这三行:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False
- Mac 用户如果没装 SimHei,换成
'Helvetica Neue'或'STHeiti';Linux 用'WenQuanYi Zen Hei' - 用
sns.set_theme(font='SimHei')没用,这个 font 参数只影响字号,不换字体族
sns.heatmap(..., cmap='coolwarm') 里写成 'CoolWarm' 就无声失败,或者保存时忘了 plt.savefig(..., dpi=300, bbox_inches='tight'),导出图永远切掉右边标签。事情说清了就结束。











