ggplot绘制箱线图如何仅视觉限制Y轴不影响统计计算
核心原因
ggplot2里的ylim()属于标度量级的范围设置,默认行为是直接丢弃所有超出设定范围的观测值,后续所有统计变换(包括箱线图的分位数计算、离群值判定)都会基于过滤后的数据集运行,自然无法得到全量数据的统计结果。
解决方案
用coord_cartesian()函数的ylim参数替代ylim()设置Y轴范围即可。coord_cartesian()是对绘图的可视区域做缩放裁剪,不会过滤任何原始数据,所有统计计算都会基于完整数据集执行,仅在最终渲染时显示你指定的Y轴区间,完全符合“统计用全量数据、视觉只看指定范围”的需求。
针对你要将Y轴视觉上限设为70的场景,只需要删除原代码中的ylim(0,100)行,新增coord_cartesian(ylim = c(0,70))即可。
优化提示
由于Y轴上限截断在70,原本大于70的离群点会被挤在绘图区上边界,影响观感。你可以在geom_boxplot()里加outlier.shape = NA参数,直接隐藏所有离群点——这不会影响箱线主体的分位数、须长的统计结果,只是不绘制点而已,能让被压缩的箱线主体结构清晰可辨。
修改后完整代码
ggplot(dataorgrec, aes(x=Soortnieuw, y=AantalGRFBYE, fill=GRFBYE))+ geom_boxplot(outlier.shape = NA) + ggtitle("Aantal recensies van categorieën van organisaties \n (beperkt tot 70 recensies per organisatie)") + theme(plot.title = element_text(hjust = 0.5)) + ylab("Aantal recensies") + xlab("") + coord_cartesian(ylim = c(0, 70)) + scale_fill_manual( values=c("#1D8DB0","#8EA9DB","#DCE7F0"), name="", labels=c("Google Review","Facebook","Yelp") ) + scale_x_discrete(labels = function(x) str_wrap(x, width = 10))
内容的提问来源于stack exchange,提问作者Robin Cuypers
相关产品推荐
相关产品推荐

