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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:25:07