如何用预计算分位数迭代绘制分组子图箱线图?
解决方案
你的问题出在三个核心点:
- 循环遍历的是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
相关产品推荐
相关产品推荐

