根据变量更改单个geom_ribbon()的颜色

时间:2018-05-07 15:34:36

标签: r ggplot2

我想绘制一个geom_ribbon(),其中我使条带的颜色以变量为条件。

示例:

library(dplyr)
library(ggplot2)

df <- tribble(
  ~year, ~lower, ~upper, ~type,
  2001, 150, 222, "A",
  2002, 53, 64, "A",
  2003, 31, 64, "B",
  2004, 10, 18, "B",
  2005, 30, 49, "B",
  2006, 37, 43, "A",
  2007, 54, 77, "B",
  2008, 58, 89, "A",
  2009, 50, 111, "A",
  2010, 40, 81, "A",
  2011, 49, 63, "A"
)

ggplot(df, aes(x = year)) +
  geom_ribbon(aes(ymin = lower, ymax = upper, fill = type))

创造了:

enter image description here

这会创建两个独立的乐队,但我只想更改一个组合乐队的颜色。

1 个答案:

答案 0 :(得分:1)

由于在ggplot中每行不能有多种颜色,我们可以将数据扩展为多条相互连接的线,使它们看起来像是一条线。然后我们可以为每个部分分配颜色。

要确保它们显示为已连接,我们必须展开数据,以便下一个组的开头和上一个组的结尾具有相同的xy坐标,但不同的组:

library(zoo)
library(data.table)
df$group <- rleid(df$type)
df_plot <- head(do.call(rbind, by(df, df$group, rbind, NA)), -1)
df_plot[,c("group","type")] <- lapply(df_plot[,c("group","type")], na.locf)
df_plot[] <- lapply(df_plot, na.locf, fromLast = TRUE)

ggplot(df_plot, aes(x = year)) +
  geom_ribbon(aes(ymin = lower, ymax = upper, fill = type, group = group))

enter image description here

将其与原始的无色线进行比较:

ggplot(df, aes(x = year)) +
  geom_ribbon(aes(ymin = lower, ymax = upper))

enter image description here

一个注意事项 - 我lapply na.locf所以类型不会改变我。我知道你可以做na.locf(df_plot)