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

如何用预计算分位数迭代绘制分组子图箱线图?

解决方案

你的问题出在三个核心点:

  • 循环遍历的是feature的计数而非名称,完全没实现数据筛选逻辑
  • add_trace时未指定子图的row参数,所有图形默认堆叠在第一个子图
  • 没有针对单个feature筛选数据,每次都用全量数据生成箱线图

修正后的完整代码如下:

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 原始数据
df = pd.DataFrame({
    "feature":['a', 'a', 'b', 'b', 'c', 'c'],
    "date":['2022-01-01', '2022-01-02', '2022-01-01', '2022-01-02', '2022-01-01', '2022-01-02'],
    "min": [0,0,9000,8000,30,35],
    "q25": [12,15,21000,15000,40,45],
    "q50": [90,100,21000,15000,50,55],
    "q75": [1500,1300,50000,60000,60,65],
    "max": [4000, 3500, 150000,200000,70,75]
})

# 创建3行1列的子图,直接指定子图标题
fig = make_subplots(
    rows=3, cols=1,
    subplot_titles=[f"Feature {feat}" for feat in df['feature'].unique()]
)

# 遍历每个feature和对应的子图行号(从1开始计数)
for row_num, feat in enumerate(df['feature'].unique(), start=1):
    # 筛选当前feature的专属数据
    feat_data = df[df['feature'] == feat]
    # 为每个日期的分位数数据添加箱线图
    for _, row in feat_data.iterrows():
        fig.add_trace(
            go.Box(
                lowerfence=row["min"],
                q1=row["q25"],
                median=row["q50"],
                q3=row["q75"],
                upperfence=row["max"],
                name=row["date"]  # 用日期作为图例名称
            ),
            row=row_num,
            col=1
        )

# 调整布局避免标题重叠,显示图例
fig.update_layout(height=800, showlegend=True)
fig.show()

关键修正说明:

  • 用df['feature'].unique()获取所有唯一feature,配合enumerate直接绑定子图行号
  • 每次循环先筛选当前feature的子集,确保只处理对应的数据
  • add_trace时指定row=row_num,将箱线图精准放到对应子图中
  • 通过subplot_titles批量设置子图标题,无需额外添加注释
  • 为每个箱线图设置name=row["date"],方便区分不同日期的图形

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:55:20