我正在做一个由一个变量分割的多个图,在每个图中,颜色代码基于另一个变量。
set.seed(12345)
dates = seq(as.Date("2000-01-01"), as.Date("2016-01-01"), by = 1)
dd = data.table(date = dates, value = rnorm(length(dates)))
dd[, year := lubridate::year(date)]
dd[, c := cut(value, c(-Inf, -3, 3, Inf))]
for (thisyear in 2000:2015) {
ggplot(dd[year == thisyear]) +
geom_ribbon(aes(x = date, ymin = -Inf, ymax = Inf, fill = c), alpha = 0.1)
}
dd[, length(unique(c)), by = year]
year V1
1: 2000 1
2: 2001 2
3: 2002 2
4: 2003 3
5: 2004 3
....
现在不同图中的颜色会不一致,因为不是每年都有相同长度的独特剪切值。更糟糕的是当一年有(-Inf,3]
个值(当然不太可能),而另一年有[3,Inf)
个值时,它们都会在两个地块中涂成红色。
如何指定(-Inf, 3]
始终采用蓝色,(-3,3]
始终采用绿色?
答案 0 :(得分:1)
手动指定要使用的颜色的一种方法是在数据框中创建一个指定要使用的绘图颜色的列。
例如:
# scatter plot
dd$color <- ifelse(dd$value <= 3, 'blue', 'green')
ggplot(dd, aes(date, value)) + geom_point(colour=dd$color)
# ribbon plot
thisyear <- '2001'
dd_year <- dd[year == thisyear,]
ggplot(dd_year, aes(date, group=color, colour=color)) +
geom_ribbon(aes(ymin=value - 1, ymax=value + 1, fill=color), alpha=0.5) +
scale_fill_manual(values=unique(dd_year$color)) +
scale_color_manual(values=unique(dd_year$color))
这将导致所有点&lt; = 3变为蓝色,其余点变为绿色。
不是最有趣的例子,因为这里只有数据点变为绿色,但它看起来应该是这样的:
答案 1 :(得分:1)
您可以创建一个命名的颜色矢量以传递给scale_fill_manual
。这允许您选择每个组的颜色以及确保每个图在组之间具有相同的颜色。
colors = c("blue", "green", "red")
names(colors) = levels(dd$c)
(-Inf,-3] (-3,3] (3, Inf]
"blue" "green" "red"
现在是相同的情节,但添加了scale_fill_manual
。
for (thisyear in 2000:2015) {
print(ggplot(dd[year == thisyear]) +
geom_ribbon(aes(x = date, y = value, ymin = -Inf, ymax = Inf, fill = c), alpha = 0.1) +
scale_fill_manual(values = colors))
}