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

如何在geom_boxplot中分散显示重叠的离群点

解决ggplot2箱线图中重复离群点重叠的问题

你的场景是:单变量箱线图中有重复的离群点(5个离群点仅3个唯一值),默认geom_boxplot会让重复值重叠,导致无法看清实际数量。你尝试用geom_jitter但没对齐箱线图中心,还存在数据合并问题,以下是几种可行的解决方法:

方法一:基于原数据筛选离群点并添加抖动

直接从原数据中筛选出离群点,指定x轴与箱线图一致(单变量箱线图默认x位置为1),同时控制抖动范围让点在箱线图宽度内分散:

library(ggplot2)
library(dplyr)

df <- data.frame(
  Ratio = c(rep(1,100), rep(0:1, 100), 4.5, 4.5, 3.5, 3.5, 7),
  ID = 1:305
)

# 计算离群点并标记到原数据
df <- df %>%
  mutate(is_outlier = Ratio %in% boxplot.stats(Ratio)$out)

ggplot(df, aes(y = Ratio)) +
  geom_boxplot(width = 0.2, outlier.shape = NA) +
  # 指定x=1对齐箱线图,控制抖动范围在箱线图宽度内
  geom_jitter(data = df %>% filter(is_outlier), 
              aes(x = 1), 
              width = 0.08,  # 调整宽度避免超出箱线图范围
              color = "red")

这个方法不需要单独处理离群点向量,直接基于原数据筛选,x轴设为1和箱线图完全对齐,抖动宽度控制在0.08(配合箱线图宽度0.2),既能分散重叠点,又不会偏离箱线图。

方法二:使用geom_dotplot展示重复点数量

如果想更直观展示同一离群值的重复次数,可以用geom_dotplot,点会堆叠起来:

ggplot(df, aes(y = Ratio)) +
  geom_boxplot(width = 0.2, outlier.shape = NA) +
  geom_dotplot(data = df %>% filter(is_outlier),
               aes(x = 1),
               binaxis = "y",
               stackdir = "center",
               dotsize = 0.8)

这种方式下,相同值的离群点会在垂直方向堆叠,一眼就能看出每个值的出现次数。

方法三:手动给重复离群点添加微小偏移

如果不想用抖动,也可以手动给重复的离群点在x轴方向加微小偏移,确保每个点都可见:

# 对离群点分组并添加偏移
df_outliers <- df %>%
  filter(is_outlier) %>%
  group_by(Ratio) %>%
  mutate(x_offset = 1 + seq(-0.05, 0.05, length.out = n()))

ggplot(df, aes(y = Ratio)) +
  geom_boxplot(width = 0.2, outlier.shape = NA) +
  geom_point(data = df_outliers, aes(x = x_offset), color = "blue")

这个方法会给同一Ratio值的离群点分配从-0.05到0.05的x偏移,让它们在箱线图中心两侧分散,既不偏离太多,又能清晰区分每个点。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:05:04