我想在单个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
plot_obj +
geom_smooth(aes(y = y1, ymin = y1_lwr, ymax = y1_upr), stat="identity", fill="blue", alpha=0.2)
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)
请注意,最后一个图表中的顶行不再是红色。为什么会发生这种情况?如何解决?谢谢!
答案 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)
答案 1 :(得分:2)
当然,重塑数据集会使事情变得更容易,并且是推荐的方法。但是,如果您想继续使用单独的图层:
由于您尚未为color
映射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)
否则,您需要为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)