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
相关产品推荐
相关产品推荐

