我们如何在单个图表中使用多个geom_smooth?

Can*_*ner 1 r ggplot2

我想geom_smooth在单个 ggplot2 图表中使用多个图层。当我尝试这样做时,配色方案就搞砸了。这是一个演示正在发生的事情的示例。

我们构建一个我们想要可视化的简单数据框。

df = data.frame(x = c("a", "b", "c"),
             y1 = seq(1, 3),
             y1_upr = seq(2, 4),
             y1_lwr = seq(0, 2),
             y2 = seq(2, 4),
             y2_upr = seq(2.5, 4.5),
             y2_lwr = seq(1.5, 3.5))
Run Code Online (Sandbox Code Playgroud)

我们可以轻松地可视化 y1 和 y2。

plot_obj = ggplot(data = df, aes(x = x, group = 1)) + 
  geom_line(aes(y = y1, colour = "y1")) + 
  geom_line(aes(y = y2, colour = "y2")) +     
  scale_colour_manual("", breaks = c("y1", "y2"), values = c("blue", "red"))
plot_obj
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 如果我们添加 1 geom_smooth,行为仍然符合预期。

plot_obj + 
  geom_smooth(aes(y = y1, ymin = y1_lwr, ymax = y1_upr), stat="identity", fill="blue", alpha=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 最后,我们添加第二geom_smooth层。

plot_obj + 
  geom_smooth(aes(y = y1, ymin = y1_lwr, ymax = y1_upr), stat="identity", fill="blue", alpha=0.2) + 
  geom_smooth(aes(y = y2, ymin = y2_lwr, ymax = y2_upr), stat="identity", fill="red", alpha=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,最后一张图表中顶线不再是红色。为什么会发生这种情况以及如何解决?谢谢你!

aos*_*ith 5

当然,重塑数据集会让事情变得更容易,并且是推荐的方法。但是,如果您想继续使用单独的图层:

由于您尚未映射colorfor geom_smooth,因此它使用默认颜色蓝色来绘制平滑线。如果您只想要丝带,请使用geom_ribbon丝带。

ggplot(data = df, aes(x = x, group = 1)) + 
    geom_line(aes(y = y1, colour = "y1")) + 
    geom_line(aes(y = y2, colour = "y2")) +     
    scale_colour_manual("", breaks = c("y1", "y2"), values = c("blue", "red")) +
    geom_ribbon(aes(ymin = y1_lwr, ymax = y1_upr), stat="identity", fill="blue", alpha=0.2) + 
    geom_ribbon(aes(ymin = y2_lwr, ymax = y2_upr), stat="identity", fill="red", alpha=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

否则,您需要为 内的每个平滑层映射颜色aes,或手动将它们设置为 外的红色和蓝色或 NA aes

ggplot(data = df, aes(x = x, group = 1)) + 
    geom_line(aes(y = y1, colour = "y1")) + 
    geom_line(aes(y = y2, colour = "y2")) +     
    scale_colour_manual("", breaks = c("y1", "y2"), values = c("blue", "red")) +
    geom_smooth(aes(y = y1, ymin = y1_lwr, ymax = y1_upr, colour = "y1"), 
              stat="identity", fill="blue", alpha=0.2) + 
    geom_smooth(aes(y = y2, ymin = y2_lwr, ymax = y2_upr, colour = "y2"), 
              stat="identity", fill="red", alpha=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述