Plotly中带归一化的混淆矩阵自定义红-绿中心色阶实现
解决混淆矩阵的红-绿中心渐变颜色映射问题
你的核心问题是颜色映射的刻度定位错误:原代码中用np.min(abs(custom_cf_matrix)) / np.max(abs(custom_cf_matrix))标记白色(0值)的位置,但这个比例和0在数据实际范围中的位置无关,导致颜色渐变没有以0为中心。另外代码中group_names未定义,会引发报错。
修正后的完整代码
import plotly.express as px import numpy as np # 定义颜色 zero_color = 'white' positive_color = 'green' negative_color = 'red' # 混淆矩阵数据 custom_cf_matrix = np.array([[395, -5], [-200, 20]]) # 计算数据范围,确定0在颜色刻度中的相对位置 min_val = np.min(custom_cf_matrix) max_val = np.max(custom_cf_matrix) zero_pos = (0 - min_val) / (max_val - min_val) # 0值对应的颜色刻度比例 # 构建正确的颜色映射刻度:负→白→正 colors = [ (0, negative_color), (zero_pos, zero_color), (1, positive_color) ] # 修复标签生成逻辑(补上缺失的group_names示例) group_names = ["TN", "FP", "FN", "TP"] group_values = [395, -5, -200, 20] labels = [f"{v1}\n{v2}" for v1, v2 in zip(group_names, group_values)] labels = np.asarray(labels).reshape(2, 2) # 创建混淆矩阵图 fig = px.imshow( custom_cf_matrix, labels={"x": "预测标签", "y": "真实标签"}, color_continuous_scale=colors, range_color=[min_val, max_val], width=500, height=500, ) fig.update_xaxes(side="bottom") fig.update_yaxes(side="left") # 添加标注 annotations = [ dict( text=text, x=col, y=row, font=dict(color="black", size=16), showarrow=False, xanchor="center", yanchor="middle", ) for row in range(2) for col, text in zip(range(2), labels[row]) ] fig.update_layout( title="带值权重的混淆矩阵", title_x=0.5, annotations=annotations, ) fig.update_xaxes(tickvals=[0, 1], ticktext=["0", "1"], showticklabels=True) fig.update_yaxes(tickvals=[0, 1], ticktext=["0", "1"], showticklabels=True) fig.show()
关键修正点
- 颜色刻度定位:通过
zero_pos = (0 - min_val)/(max_val - min_val)计算0值在整个数据范围中的相对比例,确保白色准确对应0值。 - 修复未定义变量:补上
group_names示例,避免运行报错。 - 优化标题居中:将
title_x设为0.5,实现标题水平居中。
内容的提问来源于stack exchange,提问作者Tonino Fernandez
相关产品推荐
相关产品推荐

