我想绘制一个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))
创造了:
这会创建两个独立的乐队,但我只想更改一个组合乐队的颜色。
答案 0 :(得分:1)
由于在ggplot
中每行不能有多种颜色,我们可以将数据扩展为多条相互连接的线,使它们看起来像是一条线。然后我们可以为每个部分分配颜色。
要确保它们显示为已连接,我们必须展开数据,以便下一个组的开头和上一个组的结尾具有相同的x
和y
坐标,但不同的组:
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))
将其与原始的无色线进行比较:
ggplot(df, aes(x = year)) +
geom_ribbon(aes(ymin = lower, ymax = upper))
一个注意事项 - 我lapply
na.locf
所以类型不会改变我。我知道你可以做na.locf(df_plot)
。