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

如何在Plotly Python中为多分类x轴箱形图添加中位数连线

Plotly Python 实现方案

完整可运行代码如下:

import plotly.graph_objects as go
import pandas as pd

# 构造SF Zoo样本数据
sf_df = pd.DataFrame({
    "animal": ["giraffes", "orangutans", "monkeys", "giraffes", "orangutans", "monkeys"],
    "zoo": ["SF Zoo"] * 6,
    "value": [5, 14, 23, 12, 13, 14]
})
# 构造LA Zoo样本数据
la_df = pd.DataFrame({
    "animal": ["giraffes", "orangutans", "monkeys", "giraffes", "orangutans", "monkeys", "monkeys", "giraffes"],
    "zoo": ["LA Zoo"] * 8,
    "value": [12, 18, 29, 22, 11, 19, 12, 26]
})
all_df = pd.concat([sf_df, la_df], ignore_index=True)

# 分组计算交叉分类的均值,用于绘制连接线
mean_df = all_df.groupby(["zoo", "animal"])["value"].mean().reset_index()
# 对齐Plotly多级x轴的层级顺序:[二级分类, 一级分类]
mean_x = [mean_df["animal"].tolist(), mean_df["zoo"].tolist()]
mean_y = mean_df["value"].tolist()

# 构建箱线图trace
trace_sf = go.Box(
    x=[sf_df["animal"], sf_df["zoo"]],
    y=sf_df["value"],
    boxpoints="all",
    name="SF Zoo",
    boxmean=True
)
trace_la = go.Box(
    x=[la_df["animal"], la_df["zoo"]],
    y=la_df["value"],
    boxpoints="all",
    name="LA Zoo",
    boxmean=True
)
# 构建均值连接线trace
trace_mean_line = go.Scatter(
    x=mean_x,
    y=mean_y,
    mode="lines+markers",
    name="分组均值",
    line=dict(color="red", width=2)
)

# 配置布局匹配原JS示例效果
layout = go.Layout(
    showlegend=True,
    xaxis=dict(
        tickson="boundaries",
        ticklen=15,
        showdividers=True,
        dividercolor="grey",
        dividerwidth=3
    )
)

fig = go.Figure(data=[trace_sf, trace_la, trace_mean_line], layout=layout)
fig.show()

上述代码完全复现原JS示例的所有效果:

  • 保留多分类层级x轴的分割线、刻度样式
  • 箱线图显示所有散点和内置均值标识
  • 连接线严格对齐每个交叉分类的均值位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:15:05