Plotly中用go.Box实现X轴标签与图例不同的方法
解决方案
修改要点
- 给原始设备场强字段做标签映射,转换成需求里的X轴显示文本
- 把图例统一改成指标名称,用分组功能让同指标的图联动,同时避免图例重复显示
修改后的完整代码
import plotly.graph_objects as go from plotly.subplots import make_subplots # 建立设备场强到X轴标签的映射,第三个字段名请根据实际数据调整 device_label_map = { 'device_field_strength_1.5': 'device field strength 1.5', 'device_field_strength_3': 'device field strength 3', 'device_field_strength_changed': 'device model changed' } fig = make_subplots(rows=1, cols=2, subplot_titles=("4位专家", "F1得分最高的4种方法")) device_field_strengths = device_field_strength_impact_df.device_field_strength.unique() # 记录已添加图例的指标,避免重复显示 legend_added = set() for group in ['experts', 'best_methods']: for metric in ['F1_score', 'Dice']: # 转换指标名称为图例显示文本 legend_name = 'F1 score' if metric == 'F1_score' else 'Dice score' for device_field_strength in device_field_strengths: x_label = device_label_map[device_field_strength] # 仅该指标首次出现时显示图例 show_legend = metric not in legend_added fig.add_trace(go.Box( y=device_field_strength_impact_df[(device_field_strength_impact_df.device_field_strength==device_field_strength) & (device_field_strength_impact_df.group==group) & (device_field_strength_impact_df.variable==metric)].value, x=[x_label], # 设置X轴显示的标签 name=legend_name, # 图例显示指标名称 text=group, legendgroup=metric, # 同指标归为一组,点击图例可批量控制 marker_color='darkblue' if metric == 'F1_score' else 'red', boxmean=True, showlegend=show_legend ), row=1, col=1 if group == 'experts' else 2) # 标记该指标已添加图例 if metric not in legend_added: legend_added.add(metric) # 可选:设置X轴标题 fig.update_layout( xaxis_title="设备参数", xaxis2_title="设备参数" ) fig.show()
关键改动说明
X轴标签自定义:
- 用
device_label_map字典把原始的设备场强字段名,转换成你需要的友好标签 - 在
go.Box中添加x=[x_label]参数,指定当前箱线图对应的X轴显示文本
- 用
图例优化:
- 把
name设置为"F1 score"或"Dice score",直接作为图例显示内容 - 用
legendgroup=metric把同一指标的所有箱线图归为一组,点击图例可以同时显示/隐藏该指标的所有数据 - 通过
legend_added集合控制showlegend参数,确保每个指标只在第一次出现时显示图例,避免重复条目
- 把
补充说明
之前以为Plotly Express无法显示均值,其实只需在px.box()后添加fig.update_traces(boxmean=True)就能实现,感谢r-beginners的提示!
内容的提问来源于stack exchange,提问作者arthur.sw
相关产品推荐
相关产品推荐

