在ggplot2中阴影很多不同的部分

bil*_*999 0 plot r ggplot2

这个问题基于我如何在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个不同阴影区域的图:

MWE的图

有3个阴影区域并不算太坏,但是如果我需要阴影100个阴影怎么办?有没有一种方法可以不定义100个数据帧,然后将所有这些阴影一一添加?

其次,我想让阴影超出值的中间。但是在所有三个规范(rect1rect2rect3)中,每个阴影都从该日期的值开始,到下一个日期的值结束。有关如何执行此操作的任何提示?

ana*_*ker 5

您比您想像的要近!

不必为每个矩形制作一个数据框,而只需制作一个数据框,其中每一行都是要着色的日期范围。这是上面示例的单数据帧版本(与您的示例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)

以及得到的图像:

用矩形阴影绘制

需要注意的几件事:

  1. 使用xmin = from - 1左移边界,以便阴影矩形在from列中指定的日期之前开始。
  2. 我已将其重命名为rectdateRanges以表明您可以从任何数据框中真正提取矩形数据-不必与要执行的绘图紧密联系在一起(而且可能更容易保存)如果您更描述性地命名数据框,则跟踪该行)。
  3. 另外,在你的情况,你不需要yminymax列数据框,你可以参考-InfInf直接。

更新

在我看来,如果不需要可变宽度范围,则实际上可以只对数据框使用一列(importantDates = data.frame(Date=as.Date(c(...)))),然后xmin = Date - 1,在图中使用xmax = Date + 1`。

此外,如果适合您的情况,您甚至可以importantDates根据原始数据的一列或多列(例如importantDates <- data[data$Value > 40,])来生成数据帧。