为时间序列数据中的不同日期添加多个 vlan

Adding multiple vlines for different dates in timeseries data

我正在尝试绘制包含多个时间序列数据的折线图,其中每条线显示特定对象随时间的销售趋势 - 在相同的开始日期和结束日期内。我的数据集已经是 "melted" 形式,看起来像这样:

'data.frame':   468 obs. of  3 variables:
 $ date                : Date, format: "2019-04-11" "2019-04-12" "2019-04-13" ...
 $ Object                : chr  "Object1" "Object2" "Object3" "Object 4" ...
 $ daily_sales: int  1 257 178 177 255 240 231 214 193 174 ...

我有一组需要垂直线的日期,它们存储在日期数组中,imp.dates

当我尝试绘制单个 vline 时,它工作正常(使用以下代码):

ggplot(df, aes(x=date,
               y=daily_sales,
               colour=Object,
               group=Object)) +
  geom_line() + 
  geom_vline(aes(xintercept=imp.dates[1]),
            linetype=4,
            colour="black")

但是,当我尝试执行多个操作时 vlines

ggplot(df, aes(x=date,
                   y=daily_sales,
                   colour=Object,
                   group=Object)) +
      geom_line() + 
      geom_vline(aes(xintercept=imp.dates),
                linetype=4,
                colour="black")

我收到以下错误:

Error: Aesthetics must be either length 1 or the same as the data (40): xintercept

以下是我查看过但无济于事的 SO 帖子: 1. 2. 3.How to get a vertical geom_vline to an x-axis of class date?

3 非常接近,但我的 x 变量是 class Date 而不是 int,所以似乎无法让它工作。

任何帮助将不胜感激。

您需要将 imp.dates 放入数据框中并更改 geom_vline() 层的数据。

这是一些示例数据:

set.seed(2867)
df <- expand.grid(date = seq(as.Date("2019-01-01"), as.Date("2019-12-31"), by = 1L),
                  object = paste0("object", 1:4))
df <- transform(df, daily_sales = rpois(nrow(df), lambda = 100))

set.seed(1)
imp <- data.frame(date = sample(unique(df$date), 4))

这里我只是从系列中随机选择了4个日期作为重要日期,你可以这样做:

imp <- data.frame(date = imp.dates)

让第二个数据框使用相同的变量名是有帮助的date,但我认为这不是必需的,只是helpful/easier 在你的头脑中解析。

现在我们按照您的方式构建绘图(请注意,我在代码中将 Object 更改为 object

ggplot(df, aes(x = date, y = daily_sales, colour = object, group = object)) +
  geom_line() + 
  geom_vline(data = imp,               ## 1
             aes(xintercept = date),   ## 2
             linetype = 4, colour = "black")

请注意,在我们添加 geom_vline() 图层的 ##1 行中,我们将图层的 data 参数设置为重要日期的数据框,imp.在 ## 2 行中,我们在 imp 中指定包含我们要绘制的日期的变量名称。其余绘图代码与您的一样。

这会产生(一团糟,它是随机数据):

但它现在包括 4 个选定的重要日期,以垂直线表示。