You need to enable JavaScript to run this app. Python Plotly箱线图:如何设置箱体宽度与分类样本行数成正比
优惠活动
大模型
产品
解决方案
定价
更多

Python Plotly箱线图:如何设置箱体宽度与分类样本行数成正比

实现方案

ff.create_facet_grid 生成的箱线图默认统一箱体宽度,要实现与样本量成正比的宽度适配,只需在图表生成后遍历所有箱线图 trace,按分类单独设置 width 参数即可。

步骤1:计算分类宽度映射

根据「宽度与样本行数成正比」的要求,结合 Plotly 箱线图的合理宽度范围(每个x轴类别占1单位空间,宽度建议在0.2~0.6之间避免过宽/过窄),用样本量乘以固定缩放系数生成映射表:

# 统计每个分类的样本量
type_counts = long_df['type'].value_counts()
# 正比映射:取0.06为缩放系数时,最大样本量10对应宽度0.6,最小样本量5对应宽度0.3
width_map = {
    type_name: count * 0.06
    for type_name, count in type_counts.items()
}

对应你的数据集的宽度映射结果完全符合预期排序:

  • Col2(n=5):0.3
  • Col4(n=7):0.42
  • Col1(n=9):0.54
  • Col3(n=10):0.6

步骤2:为trace设置对应宽度

在原有生成箱线图的代码后添加遍历逻辑,逐个匹配分类设置宽度:

# 原有箱线图生成代码保留
box_plot= ff.create_facet_grid(
    long_df,
    x = 'type',
    y = 'value',
    trace_type = 'box', 
    color_name = 'type',
    color_is_cat = True,
    width = 1000,
    ggplot2 = False,
    showlegend = False,
)

# 新增宽度调整逻辑
for trace in box_plot.data:
    # 仅修改箱线图类型的trace,避免影响其他图表元素
    if isinstance(trace, go.Box):
        # trace的name对应分类名称,直接匹配映射表取宽度
        trace.width = width_map[trace.name]

box_plot.show()

补充说明

  • 如果需要适配R语言ggplot2::geom_boxplot(varwidth=TRUE)的逻辑(宽度与样本量的平方根成正比),只需修改宽度映射的计算逻辑:
    import math
    width_map = {
        type_name: math.sqrt(count) * 0.2 # 调整系数可适配宽度范围
        for type_name, count in type_counts.items()
    }
    
  • 后续给图表添加分面参数(facet_row/facet_col)时,该逻辑依然生效,所有分面下同一分类的箱体宽度保持一致。
  • 若生成图后发现trace的名称与分类不匹配,可先打印[t.name for t in box_plot.data if isinstance(t, go.Box)]确认对应关系,再调整匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 02:36:06