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

自定义分位数箱线图时,如何设置与观测数平方根成比例的宽度?

自定义箱线图实现宽度随观测数平方根比例变化的解决方案

要实现箱线图宽度与观测数平方根成比例的效果,核心是将计算好的观测数平方根作为映射变量传入geom_boxplot的width美学参数中,同时建议对该值做标准化处理,避免宽度差异过大影响可视化效果。

修改步骤及完整代码

  1. 将aggregate生成的统计量矩阵拆分为单独列,包含观测数平方根;
  2. 对观测数平方根进行标准化,缩放到合理的宽度范围(比如0.2-0.8);
  3. 在geom_boxplot的aes中映射width到标准化后的数值。
rm(list = ls())
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)

set.seed(1)

residuals <- runif(n=1000, min=-3, max=3)
# 修正类别生成逻辑,确保每个类别有明确观测数
category <- rep(c('A','A','A','B','B','C','D','E','E','F'), each = 100)
df1 <- data.frame(category,residuals)


# 计算自定义箱线图统计量,并拆分为单独列
boxplot_stats <- aggregate(residuals ~ category, df1, function(x) {
  median_val = median(x)
  z_score = 1.96
  min_quantile = median_val - z_score * sd(x)
  lower_quantile = quantile(x, 0.25)
  upper_quantile = quantile(x, 0.75)
  max_quantile = median_val + z_score * sd(x)
  n_obs_sqrt = sqrt(length(x))
  c(min = min_quantile, lower = lower_quantile, middle = median_val, 
    upper = upper_quantile, max = max_quantile, n_sqrt = n_obs_sqrt)
}) %>%
  unnest_wider(residuals)

# 标准化观测数平方根到0.2-0.8的范围
boxplot_stats <- boxplot_stats %>%
  mutate(n_sqrt_scaled = rescale(n_sqrt, to = c(0.2, 0.8)))

# 绘制自定义箱线图,映射宽度到标准化后的数值
custom_boxplot <- ggplot(boxplot_stats, aes(x=category))+
  geom_boxplot(aes(ymin = min, lower = lower, middle = middle, upper = upper, 
                   ymax = max, width = n_sqrt_scaled), 
               stat = "identity", color = "black", fill="lightblue") +
  labs(title="自定义宽度箱线图",x="类别",y="残差") + 
  theme_bw()
print(custom_boxplot)

关键说明

  • 修正原代码中category的生成逻辑,确保每个类别有明确的观测数,便于验证宽度变化效果;
  • 使用unnest_wider将aggregate返回的矩阵列拆分为单独列,更适配ggplot2的变量映射逻辑;
  • 用rescale对观测数平方根做标准化,避免某类别宽度过宽或过窄,可根据需求调整to参数的范围;
  • 在geom_boxplot的aes中指定width = n_sqrt_scaled,即可让每个箱线图的宽度与对应类别的观测数平方根成比例,达到类似varwidth=TRUE的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:07:02