如何让Seaborn混淆矩阵的颜色条显示百分比而非计数?
问题
现有代码可正常运行,但希望混淆矩阵的颜色条及颜色代表百分比而非原始计数,找不到指定颜色条对应数据的方法。
解决方案
核心是把热力图的颜色映射数据源换成归一化后的百分比矩阵,同时保留原有的单元格标注(计数+百分比)。
修改后的完整可运行代码:
import numpy as np from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt truth_labels = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0] pred_labels = [1, 1, 1, 1, 0, 1, 1, 0, 0, 0] TITLE_FONT_SIZE = {"size":"40"} LABEL_FONT_SIZE = {"size":"40"} LABEL_SIZE = 40 # 生成原始混淆矩阵 conf_matrix = confusion_matrix(pred_labels, truth_labels, labels=[1, 0]) # 生成计数文本 group_counts = ["{0:0.0f}".format(value) for value in conf_matrix.flatten()] # 按实际标签列归一化计算百分比 group_normalized_percentages = (conf_matrix / np.sum(conf_matrix, axis=0, keepdims=True)).ravel() group_normalized_percentages_text = ["{0:.2%}".format(value) for value in group_normalized_percentages] # 组合单元格显示内容:计数+百分比 cell_labels = [f"{v1}\n{v2}" for v1, v2 in zip(group_counts, group_normalized_percentages_text)] cell_labels = np.asarray(cell_labels).reshape(2, 2) # 创建画布和轴对象(原代码缺失,补充以保证独立运行) fig, ax = plt.subplots(figsize=(12, 10)) sns.set(font_scale=4.0) # 关键:传入归一化后的百分比矩阵作为颜色映射依据,同时保留原标注 sns.heatmap(group_normalized_percentages.reshape(2,2), annot=cell_labels, cmap="Blues", fmt="", ax=ax, cbar_kws={'format': '%.2f%%'}) # 可选:让颜色条刻度显示为百分比 # 标题、轴标签等样式设置 title = "混淆矩阵\n" ax.set_title(title, fontdict=TITLE_FONT_SIZE) ax.set_xlabel("实际标签", fontdict=LABEL_FONT_SIZE) ax.set_ylabel("预测标签", fontdict=LABEL_FONT_SIZE) ax.tick_params(axis="both", which="major", labelsize=LABEL_SIZE) ax.set_xticklabels(["1", "0"]) ax.set_yticklabels(["1", "0"], rotation=90, va="center") plt.show()
改动说明
- 颜色映射逻辑调整:
sns.heatmap的第一个参数决定了颜色深浅对应的数值,换成百分比矩阵后,颜色就会随百分比变化,而不是原始计数。 - 颜色条格式优化:
cbar_kws参数可以自定义颜色条的显示格式,这里改成百分比后,颜色条的含义更直观。 - 补全必要代码:原代码没有初始化
ax对象,补充后代码可以直接运行,不需要额外依赖外部的轴对象。
内容的提问来源于stack exchange,提问作者lr100
相关产品推荐
相关产品推荐

