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

时间:2019-05-24 16:38:16

标签: r ggplot2 time-series 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 ...

我有一组需要竖线的日期,它们存储在Date数组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. Multiple vlines in plot gives error, ggplot2 2. ggplot2: how to add text to multiple vertical lines (geom_vlines) on a time x-axis? 3. How to get a vertical geom_vline to an x-axis of class date?

3非常接近,但是我的x变量属于Date类,而不是int类,因此似乎无法使其正常工作。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

您需要将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是有帮助的,但是我认为这不是必需的,只是有助于/更容易地解析您的头脑。

现在我们按照您的需要构建图(请注意,我在代码中将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")

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

这会产生(混乱,是随机数据):

enter image description here

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