这个问题基于我如何在R图的x轴上的日期之间提供阴影?以及如何对齐多个ggplot2图并在所有图上添加阴影。
在详细介绍之前,我希望能够压缩为遮盖许多不同部分而必须编写的代码量。我希望能够将所有这些信息放入一个代码中。
这是我的MWE:
library(ggplot2)
library(scales)
set.seed(1)
data <- data.frame(Date = seq(as.Date('2000-01-01'),
len= 23, by="1 day"),
Value = sample(1:50, 23, replace=TRUE))
rect1 <- data.frame(xmin=as.Date('2000-01-03 12:00:00'),
xmax=as.Date('2000-01-04 12:00:00'),
ymin=-Inf,
ymax=Inf)
rect2 <- data.frame(xmin=as.Date('2000-01-10'),
xmax=as.Date('2000-01-11'),
ymin=-Inf,
ymax=Inf)
rect3 <- data.frame(xmin=as.Date('2000-01-17 00:00:00'),
xmax=as.Date('2000-01-18 00:00:00'),
ymin=-Inf,
ymax=Inf)
ggplot() +
geom_line(data=data, aes(x = Date, y = Value)) +
geom_rect(data = rect1, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.4) +
geom_rect(data = rect2, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.4) +
geom_rect(data = rect3, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.4) +
scale_x_date(breaks = date_breaks("1 day"), labels = date_format("%d"))
Run Code Online (Sandbox Code Playgroud)
因此,我得到了一个具有3个不同阴影区域的图:
有3个阴影区域并不算太坏,但是如果我需要阴影100个阴影怎么办?有没有一种方法可以不定义100个数据帧,然后将所有这些阴影一一添加?
其次,我想让阴影超出值的中间。但是在所有三个规范(rect1
,rect2
和rect3
)中,每个阴影都从该日期的值开始,到下一个日期的值结束。有关如何执行此操作的任何提示?
您比您想像的要近!
不必为每个矩形制作一个数据框,而只需制作一个数据框,其中每一行都是要着色的日期范围。这是上面示例的单数据帧版本(与您的示例data
相同)。
dateRanges <- data.frame(
from=as.Date(c('2000-01-03 12:00:00', '2000-01-10', '2000-01-17 00:00:00')),
to=as.Date(c('2000-01-04 12:00:00', '2000-01-11', '2000-01-18 00:00:00'))
)
ggplot() + geom_line(data=data, aes(x = Date, y = Value)) +
geom_rect(data = dateRanges, aes(xmin = from - 1, xmax = to, ymin = -Inf, ymax = Inf), alpha = 0.4)
Run Code Online (Sandbox Code Playgroud)
以及得到的图像:
需要注意的几件事:
xmin = from - 1
左移边界,以便阴影矩形在from
列中指定的日期之前开始。rect
,dateRanges
以表明您可以从任何数据框中真正提取矩形数据-不必与要执行的绘图紧密联系在一起(而且可能更容易保存)如果您更描述性地命名数据框,则跟踪该行)。ymin
和ymax
列数据框,你可以参考-Inf
和Inf
直接。在我看来,如果不需要可变宽度范围,则实际上可以只对数据框使用一列(importantDates = data.frame(Date=as.Date(c(...)))
),然后xmin = Date - 1,
在图中使用xmax = Date + 1`。
此外,如果适合您的情况,您甚至可以importantDates
根据原始数据的一列或多列(例如importantDates <- data[data$Value > 40,]
)来生成数据帧。