如何绘制X轴含不同参数的Actual与Predicted分组柱状图
问题原因
核心错误:你直接将Actual/Predicted的类别取值(A/B/C/D)作为X轴维度,Plotly 会默认把相同类别的数据聚合到同一个X轴刻度下分组,不会按原DataFrame的逐行逻辑做独立分组,因此出现同值类别跨行列对齐、分组错乱的问题。
实现思路
要实现逐行一对一对比的效果,核心调整3点:
- 用原DataFrame的行索引作为X轴的唯一分组标识,保证每一行的Actual、Predicted两个柱子固定在同一个分组下
- 把类别值(A/B/C/D)作为柱子的文本标注显示,替代直接用类别做X轴刻度
- 保留原有置信度作为Y轴、Identifier作为颜色区分的逻辑即可
完整实现代码
import pandas as pd import plotly.express as px # 测试数据集 df = pd.DataFrame({ 'Actual': ['A', 'B', 'C', 'D'], 'Predicted': ['A', 'C', 'C', 'D'], 'Confidence': [0.9, 0.3, 0.6, 0.75] }) # 构造Actual列对应数据,保留原始行索引 df_actual = pd.DataFrame() df_actual['row_id'] = df.index df_actual['Category'] = df['Actual'].copy() df_actual['Confidence'] = 1 df_actual['Type'] = 'Actual' # 构造Predicted列对应数据,保留原始行索引 df_predicted = pd.DataFrame() df_predicted['row_id'] = df.index df_predicted['Category'] = df['Predicted'].copy() df_predicted['Confidence'] = df['Confidence'].copy() df_predicted['Type'] = 'Predicted' # 合并绘图数据集 df_combined = pd.concat([df_actual, df_predicted], ignore_index=True) # 绘制分组柱状图 fig = px.bar( df_combined, x="row_id", y="Confidence", color='Type', barmode='group', text="Category", height=400 ) # 优化X轴显示 fig.update_xaxes( ticktext=[f"样本 {i+1}" for i in df.index], tickvals=df.index, title="样本分组" ) # 调整类别文本显示位置 fig.update_traces(textposition='outside') fig.show()
效果说明
运行代码后,每一行的Actual、Predicted柱子会固定在同一个X轴分组下:
- Actual柱子高度固定为1,标注对应真实类别
- Predicted柱子高度为对应置信度,标注对应预测类别
- 不会再出现相同类别跨分组聚合对齐的问题,完全匹配预期效果。
内容的提问来源于stack exchange,提问作者Mohamed Thasin ah
相关产品推荐
相关产品推荐

