You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

Chart 1

尝试添加虚线置信区间边界的代码运行后出现线条错乱问题,异常效果如下:
Chart 2

问题原因

代码出错的核心原因有两点:

  • 新增的两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:45:55