ggplot中geom_smooth误差带触y轴限消失,如何保留完整误差带?
解决geom_smooth误差带在y轴log限制下消失的问题
问题原因
scale_y_log10(limits=c(0.01,1))会直接过滤掉所有超出该范围的数据(包括geom_smooth计算出的置信区间上下限),超出部分被转为NA,导致误差带在接近轴限时消失。
解决方案
方法1:使用coord_trans替代scale_y_log10
coord_trans先完成所有绘图计算(包括置信区间),再对坐标进行log10转换并设置显示范围,不会过滤数据,只是视觉上裁剪超出显示范围的部分,误差带会完整显示到y轴边缘。
代码示例:
ggplot(df,aes(time, od, colour = media,fill=media)) + geom_smooth(method="loess",span=0.3) + coord_trans(y = "log10", ylim = c(0.01, 1))
方法2:给scale_y_log10设置oob参数
通过oob=scales::squish将超出y轴限制的置信区间值压缩到轴的极限值,而不是转为NA,这样误差带就能在设定的区间内完整显示。
代码示例:
library(scales) # 需提前加载scales包 ggplot(df,aes(time, od, colour = media,fill=media)) + geom_smooth(method="loess",span=0.3) + scale_y_log10(limits=c(0.01,1), oob = squish)
两种方法的区别
coord_trans:仅做视觉坐标转换,原始数据和统计计算结果不变,适合需要保持数据真实性的场景。squish:修改了超出范围的统计值,将其映射到轴的极限,适合依赖scale特性(如自定义刻度、颜色映射关联scale)的场景。
内容的提问来源于stack exchange,提问作者Salt_Industry
相关产品推荐
相关产品推荐

