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

Plotly Express分面箱线图如何为各分面添加不同自定义限值线

问题解答

你参考的分面添加轨迹的方案并非仅适用于散点图场景,限值线只出现在单个分面的核心原因是:直接调用add_trace新增的轨迹,默认会绑定到最后一个创建的分面子图上,这个规则对plotly所有类型的分面图都生效,和图本身是箱线图还是散点图无关。你观察到线出现在左下角分面,就是因为该分面是分面创建流程中最后生成的子图。

给指定分面添加专属限值/参考线的需求完全可以实现,两种常用实现方式如下:

  • 加水平/垂直参考线优先用add_hline/add_vline原生方法,支持直接指定所属分面,不需要手动匹配坐标轴,逻辑更简单
  • 加折线、斜线等自定义轨迹时,给新增轨迹指定xaxis、yaxis参数绑定对应分面的坐标轴即可,分面坐标轴按创建顺序编号,第一个分面对应x/y,第二个对应x2/y2,依次类推

可直接参考如下可运行代码,替换成你的实际数据和限值映射即可:

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

# 替换为你的实际数据集
data = pd.DataFrame({
    "id": ["id1"]*100 + ["id2"]*100 + ["id3"]*100 + ["id4"]*100,
    "group": ["1","3"]*200,
    "signal": list(range(100))*4
})
# 按实际情况配置每个id对应的高低限值
limit_map = {
    "id1": {"high":16, "low":11},
    "id2": {"high":18, "low":10},
    "id3": {"high":15, "low":12},
    "id4": {"high":17, "low":9}
}

fig = px.box(
    data, x='group', y='signal', facet_col='id', facet_col_wrap=2,
    height=1000, title='signals', points="all", color="group"
)
fig.update_traces(width=0.6)

# 遍历所有分面添加对应限值线
for facet_idx, facet_anno in enumerate(fig.layout.annotations):
    # 从分面标题提取当前分面对应的id值
    current_id = facet_anno.text.split("=")[-1]
    # 计算当前分面的行列位置(适配facet_col_wrap=2的排布)
    col_pos = (facet_idx // 2) + 1
    row_pos = (facet_idx % 2)
    # 加高限值线,仅第一个分面显示图例避免重复
    fig.add_hline(
        y=limit_map[current_id]["high"], line_color="red",
        facet_col=col_pos, facet_row=row_pos,
        name="High Limit", showlegend=(facet_idx == 0)
    )
    # 加低限值线
    fig.add_hline(
        y=limit_map[current_id]["low"], line_color="green",
        facet_col=col_pos, facet_row=row_pos,
        name="Low Limit", showlegend=(facet_idx == 0)
    )

# 若需添加非水平自定义轨迹,参考如下手动绑定坐标轴写法
# fig.add_trace(go.Scatter(
#     x=['1','3'], y=[10,18], mode="lines", name="自定义线",
#     xaxis="x", yaxis="y" # 绑定到第一个分面
# ))
# fig.add_trace(go.Scatter(
#     x=['1','3'], y=[9,17], mode="lines", name="自定义线",
#     xaxis="x2", yaxis="y2", showlegend=False # 绑定到第二个分面,隐藏重复图例
# ))

fig.show()

上述代码运行后会给每个分面匹配对应id专属的限值线,不会出现轨迹集中在单个分面的问题,也不会出现图例重复冗余的情况。如果你的分面排布参数facet_col_wrap有调整,只需要对应修改代码里计算分面行列位置的除数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:57:24