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

