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

