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

R语言指定分位数绘制箱线图时如何重新添加离群点

你通过stat_summary手动传入箱线图的五个边界值时,geom_boxplot不会自动计算离群点,需要额外手动添加,有两种常用实现方案:


方案一:直接使用geom_boxplot自带的分位数自定义参数(最简方案)

直接在geom_boxplot中指定quantiles参数设置你需要的五个分位数,ggplot会自动按你设置的0.05分位(下须)和0.95分位(上须)判定离群点并自动绘制,代码如下:

ggplot(data, aes(Site, LOG10Val)) +
  geom_boxplot(
    quantiles = c(0.05, 0.2, 0.5, 0.8, 0.95)
  )

如果需要分组错位对齐,直接加position参数即可,示例(按Analyte分组填色):

ggplot(data, aes(Site, LOG10Val, fill = Analyte)) +
  geom_boxplot(
    quantiles = c(0.05, 0.2, 0.5, 0.8, 0.95),
    position = position_dodge(width = 0.8)
  )

方案二:手动计算离群点后叠加(适合复杂自定义逻辑)

如果你的离群点判定规则更特殊,或者需要单独控制离群点的样式,可以先给每个分组计算分位数阈值,过滤出离群点后再叠加到图上:

第一步:数据预处理

library(dplyr)
library(ggplot2)

# 按分组计算5%、95%分位数,标记离群点
data_processed <- data %>%
  # 如果有多个分组维度(比如同时按Site和Analyte分组),这里可以加多个列:group_by(Site, Analyte)
  group_by(Site) %>% 
  mutate(
    # na.rm = TRUE 避免数据有缺失值时计算报错
    q05 = quantile(LOG10Val, 0.05, na.rm = TRUE),
    q95 = quantile(LOG10Val, 0.95, na.rm = TRUE),
    is_outlier = LOG10Val < q05 | LOG10Val > q95
  ) %>%
  ungroup()

第二步:绘图

ggplot(data_processed, aes(Site, LOG10Val)) + 
  # 自定义分位数箱线图
  stat_summary(
    geom = "boxplot", 
    fun.data = function(x) setNames(
      quantile(x, c(0.05, 0.2, 0.5, 0.8, 0.95), na.rm = TRUE), 
      c("ymin", "lower", "middle", "upper", "ymax")
    ), 
    position = "dodge"
  ) +
  # 叠加离群点,可自定义大小、颜色等样式
  geom_point(
    data = ~ filter(.x, is_outlier),
    size = 1.5,
    color = "darkred",
    # 有分组时调整宽度和箱线图对齐
    position = position_dodge(width = 0.75) 
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:57:02