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

使用stat_summary结合aes(group=...)生成个性化箱线图的问题

解决stat_summary自定义箱线图的两个问题

问题根源分析

  • 异常值未全部标红:自定义异常值函数筛选逻辑有误,或stat_summary参数配置错误,导致部分异常值未被识别。
  • 须线被截断:须线端点未使用预设的1/99百分位,而是误取了异常值的极值,违背了自定义逻辑。

修正后的代码实现

首先定义符合stat_summary要求的统计函数:

# 自定义箱线图统计函数:返回1%、25%、中位数、75%、99%分位数
custom_box_stats <- function(x) {
  qs <- quantile(x, c(0.01, 0.25, 0.5, 0.75, 0.99), na.rm = TRUE)
  data.frame(
    ymin = qs[1],   # 须线下限(1%分位数)
    lower = qs[2],  # 箱线下限(25%分位数)
    middle = qs[3], # 中位数
    upper = qs[4],  # 箱线上限(75%分位数)
    ymax = qs[5]    # 须线上限(99%分位数)
  )
}

# 自定义异常值筛选函数:返回所有超出1/99百分位的数值
custom_outlier_points <- function(x) {
  qs <- quantile(x, c(0.01, 0.99), na.rm = TRUE)
  x[x < qs[1] | x > qs[2]]
}

然后调用ggplot生成12个自定义箱线图:

library(ggplot2)

# 替换为你的数据框和列名:df=数据框,group=分组列,value=数值列
ggplot(df, aes(x = group, y = value)) +
  # 绘制箱线图(含1%-99%须线)
  stat_summary(fun.data = custom_box_stats, geom = "boxplot", fill = "white") +
  # 绘制红色异常值点
  stat_summary(fun.y = custom_outlier_points, geom = "point", color = "red", size = 2)

关键说明

  • 箱线部分:custom_box_stats严格以1%和99%分位数作为须线端点,完全独立于异常值计算,彻底解决须线被截断的问题。
  • 异常值部分:custom_outlier_points精准筛选所有超出范围的点,通过单独的stat_summary调用绘制,确保所有符合条件的点都被标记为红色。
  • 额外注意:函数中加入na.rm = TRUE避免缺失值干扰;绘图顺序上先画箱线再画异常值,防止异常值被遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:40:35