You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plotly Express箱线图中用SEM线替换默认须线?

Plotly箱线图替换须线为均值标准误(SEM)的实现方法

核心结论

Plotly Express没有直接参数能将箱线图的默认须线(最值/IQR边界)替换为均值标准误(SEM),但可以通过手动计算统计量+修改图形属性实现需求。

具体步骤

1. 提前计算分组统计量

首先用Pandas计算每个task_level分组的四分位数、中位数、均值、SEM及SEM上下限:

import pandas as pd
import numpy as np

# 按task_level分组计算所需统计量
group_stats = data_comb.groupby('task_level')['value'].agg(
    q1=lambda x: np.percentile(x, 25),
    median=lambda x: np.percentile(x, 50),
    q3=lambda x: np.percentile(x, 75),
    mean=np.mean,
    sem=lambda x: np.std(x, ddof=1) / np.sqrt(len(x))  # 标准误计算公式
).reset_index()

# 计算均值±SEM的上下限
group_stats['sem_lower'] = group_stats['mean'] - group_stats['sem']
group_stats['sem_upper'] = group_stats['mean'] + group_stats['sem']

2. 方案一:基于Plotly Express修改须线

在你原有px.box代码的基础上,遍历每个分组的trace,将须线对应的lowerfence和upperfence替换为SEM上下限:

import plotly.express as px

fig = px.box(data_comb, 
             x='task_level', 
             y='value',   
             color='task_level', 
             title = f"{title}<br><sup>{stitle}</sup>",)
fig.update_traces(boxpoints=False)

# 遍历每个分组,更新须线位置为SEM上下限
for level in group_stats['task_level']:
    stats_row = group_stats[group_stats['task_level'] == level].iloc[0]
    fig.update_traces(
        selector=dict(name=level),
        lowerfence=stats_row['sem_lower'],
        upperfence=stats_row['sem_upper']
    )

fig.show()

3. 方案二:用Plotly Graph Objects手动构建

如果需要更灵活的控制,直接用graph_objects构建箱线图,手动指定所有统计参数:

import plotly.graph_objects as go
import plotly.express as px

fig = go.Figure()

# 为每个分组添加自定义箱线
for idx, row in group_stats.iterrows():
    fig.add_trace(go.Box(
        name=row['task_level'],
        q1=[row['q1']],
        median=[row['median']],
        q3=[row['q3']],
        lowerfence=[row['sem_lower']],
        upperfence=[row['sem_upper']],
        boxpoints=False,
        marker_color=px.colors.qualitative.Plotly[idx]  # 匹配px.box默认配色
    ))

# 设置布局
fig.update_layout(
    title=f"{title}<br><sup>{stitle}</sup>",
    xaxis_title='task_level',
    yaxis_title='value'
)

fig.show()

注意事项

  • 两种方案都会保留箱线图的箱体(四分位数区间)和中位数线,仅将须线替换为均值±SEM的范围;
  • 方案一中用name匹配分组是更稳妥的方式,可避免分组顺序不一致导致的错误;
  • SEM的计算公式为样本标准差/√样本量,代码中用ddof=1保证计算的是样本标准差。

内容的提问来源于stack exchange,提问作者user20646185

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:31:03