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
相关产品推荐
相关产品推荐

