如何用R的ggplot绘制箱线图并仅展示须外散点?
实现带指定须范围且仅显示须外散点的ggplot箱线图
要实现你的需求,核心思路是先筛选出超出5%-95%分位数范围的点,再配合自定义箱线图的须范围,最后只给这些筛选后的点添加散点。以下是具体实现步骤,用mtcars数据集做演示:
步骤1:计算分位数并筛选须外数据点
先提取目标变量的5%和95%分位数,再筛选出超出这个范围的异常点:
library(ggplot2) # 以mpg变量为例,计算5%和95%分位数 q5 <- quantile(mtcars$mpg, 0.05) q95 <- quantile(mtcars$mpg, 0.95) # 筛选出低于5%或高于95%分位数的点 outlier_points <- mtcars[mtcars$mpg < q5 | mtcars$mpg > q95, ]
步骤2:绘制自定义箱线图+须外散点
这里需要注意两个关键设置:一是让箱线图的须延伸至5%-95%分位数,二是隐藏箱线图自带的异常点,避免和手动添加的散点重复:
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + # 绘制自定义须(延伸至5%-95%分位数) stat_boxplot( geom = "errorbar", width = 0.3, aes(ymin = ..y..[which(..quantile.. == 0.05)], ymax = ..y..[which(..quantile.. == 0.95)]) ) + # 绘制箱体,隐藏自带的异常点 geom_boxplot(width = 0.5, outlier.shape = NA) + # 仅添加须外的散点 geom_dotplot(data = outlier_points, binaxis = "y", stackdir = "center", dotsize = 0.8) + # 自定义标签 labs(x = "气缸数", y = "每加仑英里数", title = "箱线图(须:5%-95%分位数)") + theme_minimal()
简化写法(无需提前筛选数据)
如果不想额外创建筛选后的数据集,可以直接在geom_dotplot中通过data参数实时过滤数据:
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + stat_boxplot( geom = "errorbar", width = 0.3, aes(ymin = quantile(mpg, 0.05), ymax = quantile(mpg, 0.95)), position = position_dodge(0.5) ) + geom_boxplot(width = 0.5, outlier.shape = NA) + # 直接在散点层过滤出须外的点 geom_dotplot( data = ~ subset(., mpg < quantile(mpg, 0.05) | mpg > quantile(mpg, 0.95)), binaxis = "y", stackdir = "center", dotsize = 0.8 ) + theme_minimal()
关键细节说明
stat_boxplot用来生成自定义范围的须,替代默认的1.5*IQR须范围geom_boxplot(outlier.shape = NA):关闭箱线图自带的异常点标记,避免重复显示geom_dotplot仅使用须外的数据集,确保只显示超出范围的散点
内容的提问来源于stack exchange,提问作者user23486677
相关产品推荐
相关产品推荐

