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

wra*_*ool 2 r time-series ggplot2 timeserieschart

我正在尝试绘制包含多个时间序列数据的折线图,其中每条线显示特定对象随时间的销售趋势 - 在相同的开始日期和结束日期内。我的数据集已经处于“融化”形式,如下所示:

'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 ...
Run Code Online (Sandbox Code Playgroud)

我有一组需要垂直线的日期,它们存储在日期数组中,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")
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试做多个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")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error: Aesthetics must be either length 1 or the same as the data (40): xintercept
Run Code Online (Sandbox Code Playgroud)

以下是我看过但无济于事的帖子: 1.图中的多个 vlines 给出错误,ggplot2 2. ggplot2:如何将文本添加到时间 x 轴上的多个垂直线(geom_vlines)? 3.如何获得与班级日期的x轴垂直的geom_vline?

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

任何帮助将不胜感激。

Rei*_*son 5

您需要放入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))
Run Code Online (Sandbox Code Playgroud)

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

imp <- data.frame(date = imp.dates)
Run Code Online (Sandbox Code Playgroud)

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

现在我们按照你的方式构建情节(注意我在代码中更改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")
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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