ggplot2中如何正确绘制带虚线边界的置信区间?
初始绘图代码与效果
初始可正常绘制分组拟合线与置信带的代码如下:
ggplot(pred_grid, aes(x = x, y = y)) + geom_smooth( aes( ymin = lwr2, ymax = upr2, fill = group, colour = group), stat = "identity") + theme_gray(base_size = 17) + scale_x_continuous(labels = scales::comma) + scale_y_continuous(labels = scales::comma)

尝试添加虚线置信区间边界的代码运行后出现线条错乱问题,异常效果如下:
问题原因
代码出错的核心原因有两点:
- 新增的两个
geom_line()图层未设置分组映射。geom_smooth()中fill和colour都映射到了分组变量,会自动按组拆分数据绘制独立的拟合线和置信带,但geom_line()仅指定了y轴对应的置信区间上下界,没有绑定分组变量,ggplot会默认将所有数据按x值排序后全局连线,直接导致跨组乱连的错误线条。 - 边界虚线未绑定分组颜色映射,默认使用全局单色绘制,和分组配色逻辑不匹配,视觉效果混乱。
注:两段代码中分组变量名从group改成了brand,只要和你数据集中的实际列名一致就不会引发报错,不是核心问题。
修正方案
给两个geom_line()补上和geom_smooth()一致的颜色分组映射,即可让虚线按组拆分、和对应组的拟合线颜色保持统一。如果不需要虚线出现在图例中,可以添加show.legend = FALSE避免图例重复。
修正后的完整代码:
ggplot(pred_grid, aes(x = x, y = y)) + geom_smooth( aes( ymin = lwr2, ymax = upr2, fill = brand, colour = brand), stat = "identity") + geom_line(aes(y = lwr2, colour = brand), linetype = "dashed", show.legend = FALSE) + geom_line(aes(y = upr2, colour = brand), linetype = "dashed", show.legend = FALSE) + theme_gray(base_size = 17) + scale_x_continuous(labels = scales::comma) + scale_y_continuous(labels = scales::comma)
内容的提问来源于stack exchange,提问作者user16993967
相关产品推荐
相关产品推荐

