如何在Seaborn热力图混淆矩阵单元格同时标注数值与百分比
在Seaborn热力图混淆矩阵中同时显示绝对数值与百分比并屏蔽0值单元格
要实现同时显示绝对数值和百分比,你需要自定义标注文本数组,再传递给seaborn.heatmap的annot参数。结合你的需求,完整实现代码如下:
import seaborn as sns import numpy as np # 计算每行样本总数,用于行内占比计算 row_sums = pyArray_cf.sum(axis=1, keepdims=True) # 生成百分比矩阵(转为百分比数值,方便格式化) percentages = (pyArray_cf / row_sums) * 100 # 构建自定义标注文本:格式为「绝对数值 (百分比)」,0值单元格设为空 annot_text = np.array([ [f"{val} ({pct:.1f}%)" if val != 0 else "" for val, pct in zip(row, pct_row)] for row, pct_row in zip(pyArray_cf, percentages) ]) # 绘制热力图 h_map = sns.heatmap( percentages / 100, # 热力图颜色基于0-1范围的百分比,与原逻辑一致 vmin=0, vmax=1, annot=annot_text, # 使用自定义标注文本 fmt='s', # 指定标注为字符串格式,避免自动格式化 cmap="Blues", ax=ax1, mask=pyArray_cf == 0, # 保留原逻辑,屏蔽0值单元格 xticklabels=x_axis_labels_1, yticklabels=y_axis_labels_1 )
关键说明
- 百分比计算:
row_sums保证百分比为行内样本占比,和你原代码的逻辑完全匹配 - 自定义标注:通过列表推导式逐个生成单元格文本,0值单元格设为空,配合
mask实现完全隐藏 - 格式控制:
fmt='s'告诉Seaborn直接使用传入的字符串标注,不会额外做数值格式化 - 颜色映射:热力图底层数据仍用0-1范围的百分比,保证颜色深浅和原代码一致
内容的提问来源于stack exchange,提问作者dododabird
相关产品推荐
相关产品推荐

