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

如何在ggplot箱线图中纳入异常值?附现有代码求助

解决ggplot箱线图不显示异常值的问题

你的问题主要来自两个核心原因:x轴范围限制截断了异常值,或者未明确指定异常值的显示参数。以下是具体调整方案:

1. 修复x轴范围对异常值的截断

你代码里的scale_x_continuous(limits = c(1, 7))会直接移除所有超出1-7范围的数据点(包括异常值)。如果想保留这些异常值,有两种处理方式:

  • 方式一:移除x轴范围限制(如果数据范围允许):
    删掉limits = c(1, 7),让x轴自动适配所有数据,异常值就能正常显示。
  • 方式二:压缩超出范围的异常值到轴边界:
    使用scales::squish函数,把超出1-7的异常值显示在轴的两端,而非直接删除:
    scale_x_continuous(breaks = seq(1, 7, 1), limits = c(1, 7), oob = scales::squish)
    

2. 显式指定异常值的显示样式

虽然geom_boxplot默认显示异常值,但可以显式设置参数确保它显示,还能自定义样式:
在geom_boxplot()里添加异常值相关参数,同时保持与stat_boxplot一致的position,避免异常值和箱线图错位:

geom_boxplot(position = position_dodge(width = 0.75), 
             outlier.shape = 19,  # 异常值用圆点
             outlier.color = "black",  # 异常值颜色
             outlier.size = 2)  # 异常值大小

调整后的完整代码

library(scales)  # 需加载scales包使用squish函数

data_insurances_boxplot_merged <- ggplot(data_insurances_merged, aes(x = value, y = func, fill = group)) + 
  stat_boxplot(geom = "errorbar", width = 0.3, position = position_dodge(width = 0.75)) +
  geom_boxplot(position = position_dodge(width = 0.75),
               outlier.shape = 19,
               outlier.color = "black",
               outlier.size = 2) +
  stat_summary(fun.y = mean, geom = "point", shape = 20, size = 3, color = "red",
               position = position_dodge2(width = 0.75,   
                                          preserve = "single")) +
  scale_x_continuous(breaks = seq(1, 7, 1), limits = c(1, 7), oob = scales::squish) +
  scale_fill_manual(values = c("#E6645E", "#EF9C9D")) +
  labs(x = "", 
       y = "", title = "") +
  theme_light(base_size = 12) +
  theme(legend.title = element_blank())

data_insurances_boxplot_merged

如果你的异常值本来就在1-7范围内,仅调整geom_boxplot的position和异常值参数即可显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:39:18