seaborn.heatmap传字符串标注报错,如何仅标注热图部分行列?
错误产生原因
seaborn heatmap 函数的 fmt 参数默认值为 'g',该格式符仅适用于数值类型的标注格式化。当你向 annot 参数传入字符串数组时,程序尝试用数值格式符处理字符串对象,就会触发该类型不匹配的报错。
实现仅标注热图指定行列的方案
只要把 fmt 参数显式设置为适配字符串的 's' 即可,完整的实现逻辑如下:
- 构造与热图输入数据集形状完全一致的标注数组,需要显示标注的位置填入对应字符串/数值转成的字符串,不需要显示的位置填入空字符串
'' - 调用
heatmap时同时传入自定义的标注数组,以及fmt='s'参数
示例代码如下:
import seaborn as sns import numpy as np import matplotlib.pyplot as plt # 生成测试数据 data = np.random.rand(5, 5) # 构造标注数组:仅标注第1行和第3列(索引从0开始) annot = np.full(data.shape, '', dtype=str) # 标注第1行所有列 annot[1, :] = data[1, :].round(2).astype(str) # 标注第3列所有行 annot[:, 3] = data[:, 3].round(2).astype(str) # 绘制热图,fmt设为字符串格式 sns.heatmap(data, annot=annot, fmt='s') plt.show()
可选优化方案:如果不想手动处理字符串转换,也可以直接构造数值类型的标注数组,不需要显示标注的位置填
np.nan,调用函数时新增参数annot_kws={"na": ""}即可,示例如下:
annot = np.full(data.shape, np.nan) annot[1, :] = data[1, :] annot[:, 3] = data[:, 3] sns.heatmap(data, annot=annot, fmt='.2f', annot_kws={"na": ""})
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

