R 如何在一张图表中使用多个几何图形?

R 如何在一张图表中使用多个几何图形?,r,ggplot2,R,Ggplot2,我想在一张ggplot2图表中使用多个geom_smooth图层。当我试着这么做时,配色方案就搞砸了。下面是一个例子,演示正在发生的事情 我们构建了一个简单的数据框架,我们想要可视化 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,

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

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

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))
我们可以很容易地想象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
如果我们添加一个
geom_smooth
,则行为仍与预期一样

plot_obj + 
  geom_smooth(aes(y = y1, ymin = y1_lwr, ymax = y1_upr), stat="identity", fill="blue", alpha=0.2)
最后,我们添加第二个
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)


请注意,上一个图表中的顶行不再是红色。为什么会发生这种情况?如何解决?谢谢大家!

我可能会做一些更接近这一点的事情:

library(dplyr)
df1 <- df %>%
    select(x,contains("y1")) %>%
    rename(y = y1, y_upr = y1_upr, y_lwr = y1_lwr) %>%
    mutate(grp = "y1")
df2 <- df %>%
    select(x,contains("y2")) %>%
    rename(y = y2, y_upr = y2_upr, y_lwr = y2_lwr) %>%
    mutate(grp = "y2")
df_all <- bind_rows(df1, df2)

ggplot(df_all,aes(x = x, y = y, ymin = y_lwr, ymax = y_upr, group = grp)) +
    geom_line(aes(color = grp)) + 
    geom_ribbon(aes(fill = grp), alpha = 0.2)
库(dplyr)
df1%
选择(x,包含(“y1”))%>%
重命名(y=y1,y_-upr=y1_-upr,y_-lwr=y1_-lwr)%>%
突变(grp=“y1”)
df2%
选择(x,包含(“y2”))%>%
重命名(y=y2,y_-upr=y2_-upr,y_-lwr=y2_-lwr)%>%
突变(grp=“y2”)

df_all我可能会做一些更接近这一点的事情:

library(dplyr)
df1 <- df %>%
    select(x,contains("y1")) %>%
    rename(y = y1, y_upr = y1_upr, y_lwr = y1_lwr) %>%
    mutate(grp = "y1")
df2 <- df %>%
    select(x,contains("y2")) %>%
    rename(y = y2, y_upr = y2_upr, y_lwr = y2_lwr) %>%
    mutate(grp = "y2")
df_all <- bind_rows(df1, df2)

ggplot(df_all,aes(x = x, y = y, ymin = y_lwr, ymax = y_upr, group = grp)) +
    geom_line(aes(color = grp)) + 
    geom_ribbon(aes(fill = grp), alpha = 0.2)
库(dplyr)
df1%
选择(x,包含(“y1”))%>%
重命名(y=y1,y_-upr=y1_-upr,y_-lwr=y1_-lwr)%>%
突变(grp=“y1”)
df2%
选择(x,包含(“y2”))%>%
重命名(y=y2,y_-upr=y2_-upr,y_-lwr=y2_-lwr)%>%
突变(grp=“y2”)

df_all当然,重塑数据集将使事情变得更容易,这是推荐的方法。但是,如果要继续使用单独的层:

由于尚未为
geom_smooth
映射
颜色
,因此它对绘制的平滑线使用默认的蓝色。如果只需要功能区,请使用
geom_功能区

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)

否则,您需要在
aes
中映射每个平滑层的颜色,或者在
aes
之外手动将其设置为红色和蓝色或NA

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)

当然,重塑数据集会让事情变得更简单,这是推荐的方法。但是,如果要继续使用单独的层:

由于尚未为
geom_smooth
映射
颜色
,因此它对绘制的平滑线使用默认的蓝色。如果只需要功能区,请使用
geom_功能区

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)

否则,您需要在
aes
中映射每个平滑层的颜色,或者在
aes
之外手动将其设置为红色和蓝色或NA

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)

重塑数据形状,并添加分组变量
melt
答案给出了
geom_平滑
绘制蓝线的想法。因此,如果要添加这样的单独层,则需要在
geom_平滑
层中使用
color=“red”
。如果其中一条线不是蓝色的,您可能会在两个层中都注意到它。您可以使用
color=NA
关闭由
geom_smooth
绘制的线,这将覆盖您的第一条线。或者您可以更改层的顺序(先平滑,然后直线)。这些只是@aosmith指出的解决问题的其他方法。(虽然在我看来,重塑是一种更好的长期策略。)重塑数据,并添加分组变量
melt
答案给出了
geom_平滑
绘制蓝线的想法。因此,如果要添加这样的单独层,则需要在
geom_平滑
层中使用
color=“red”
。如果其中一条线不是蓝色的,您可能会在两个层中都注意到它。您可以使用
color=NA
关闭由
geom_smooth
绘制的线,这将覆盖您的第一条线。或者您可以更改层的顺序(先平滑,然后直线)。这些只是@aosmith指出的解决问题的其他方法。(尽管在我看来,重塑是一个更好的长期战略。)