如何在ggplot中为geom_line添加来自pred数据框的95%置信区间
问题
我尝试用ggplot把模型拟合结果和数据点放在同一张图里,但没法把计算好的95%置信区间(pred$conf.low、pred$conf.high)加到模型拟合线(pred$predicted)上。
我用glmmTMB拟合了模型,再用ggpredict生成包含预测值和置信区间的pred数据框,当前能正常运行的绘图代码是:
ggplot(data = toad2, aes(x = DO, y = num)) + geom_point(color='blue') + geom_line(color='red',data = pred, aes(x=x, y=predicted))
我尝试了下面的代码,却出现"Ignoring unknown aesthetics: ymin and ymax"的警告,没法成功添加置信区间:
ggplot(data = toad2, aes(x = DO, y = num)) + geom_point(color='blue') + geom_line(color='red',data = pred, aes(x=x, y=predicted, ymin = conf.low, ymax = conf.high))
相关数据与模型代码:
> head(toad2,5) num DO 753 0 8.41 755 0 8.27 756 0 8.31 757 0 8.04 758 0 7.77 > str(toad2) 'data.frame': 640 obs. of 2 variables: $ num: int 0 0 0 0 0 0 0 0 0 0 ... $ DO : num 8.41 8.27 8.31 8.04 7.77 7.43 7.54 7.37 7.33 6.75 ... - attr(*, "na.action")= 'omit' Named int [1:1005] 1 2 3 4 5 6 7 8 9 10 ... ..- attr(*, "names")= chr [1:1005] "1" "2" "3" "4" ... fit <- glmmTMB(num ~ DO, family=nbinom2, ziformula = ~0, dispformula = ~1, toad2, REML = FALSE) pred <- ggpredict(fit, terms = "DO")
解决方法
问题出在geom_line不支持ymin和ymax这两个美学参数,它们是给绘制置信区间填充带的geom_ribbon设计的。正确做法是分开用geom_ribbon画置信区间带,再用geom_line画拟合线,代码如下:
ggplot(data = toad2, aes(x = DO, y = num)) + geom_point(color='blue') + # 绘制置信区间填充带,设置透明度避免遮挡 geom_ribbon(data = pred, aes(x = x, ymin = conf.low, ymax = conf.high), fill = "red", alpha = 0.2) + # 绘制模型拟合线 geom_line(data = pred, aes(x = x, y = predicted), color='red')
补充说明
- 图层顺序:先画置信区间带,再画拟合线,最后保留数据点在最上层,这样数据点不会被遮挡。
- 若不想用填充带,只想画置信区间的上下虚线,可以用两条
geom_line分别绘制上下限:
ggplot(data = toad2, aes(x = DO, y = num)) + geom_point(color='blue') + geom_line(data = pred, aes(x = x, y = predicted), color='red') + geom_line(data = pred, aes(x = x, y = conf.low), color='red', linetype = "dashed") + geom_line(data = pred, aes(x = x, y = conf.high), color='red', linetype = "dashed")
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

