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

如何为Plotly绘制的箱形图(boxplot)添加样本计数信息

实现方案

以下分别对应三个位置的实现代码,可直接运行测试:

1. 标注放在中位数线顶部

核心思路是遍历箱线图的每条轨迹,提取对应中位数坐标后添加文本标注:

import plotly.express as px
 
df = px.data.iris()
fig = px.box(df, x='species', y='sepal_length')

# 生成物种-样本数映射字典
count_dict = df['species'].value_counts().to_dict()

# 遍历每个物种的箱线轨迹
for trace in fig.data:
    species = trace.name
    sample_cnt = count_dict[species]
    # 提取当前箱线的中位数数值
    median_val = trace.median[0]
    # 在中位数上方添加计数标注
    fig.add_annotation(
        x=species,
        y=median_val,
        text=f'n={sample_cnt}',
        showarrow=False,
        yshift=12, # 向上偏移避免和中位数线重叠,可根据需求调整
        font=dict(size=13, color='#222')
    )

fig.show()

2. 标注放在最大值/最小值线顶部

只需修改上述代码中提取的坐标值即可:

  • 放在最大值(上须)顶部:将median_val = trace.median[0]替换为median_val = trace.whiskerhigh[0]
  • 放在最小值(下须)顶部:将median_val = trace.median[0]替换为median_val = trace.whiskerlow[0]

同时可调整yshift参数控制标注和线的间距。

3. 计数放在悬浮提示框内部

通过修改hover模板实现,无需额外添加标注:

import plotly.express as px
 
df = px.data.iris()
# 生成物种-样本数映射字典
count_dict = df['species'].value_counts().to_dict()
# 给原数据新增样本数列
df['sample_count'] = df['species'].map(count_dict)

fig = px.box(
    df, x='species', y='sepal_length',
    custom_data=['sample_count'] # 将样本数传入自定义数据
)

# 修改悬浮提示模板,添加样本数显示
fig.update_traces(
    hovertemplate='<br>'.join([
        '物种: %{x}',
        '花萼长度: %{y}',
        '样本数: %{customdata[0]}',
        '<extra></extra>' # 去掉默认的额外信息,可选
    ])
)

fig.show()

如果不想重新生成图表,也可以直接修改已有图表的轨迹属性:

# 接你最初写的基础代码
count_dict = df['species'].value_counts().to_dict()
for trace in fig.data:
    trace.customdata = [[count_dict[trace.name]]]
    trace.hovertemplate='<br>'.join([
        '物种: %{x}',
        '花萼长度: %{y}',
        '样本数: %{customdata[0]}',
        '<extra></extra>'
    ])
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:00