Добавление нескольких vlines для разных дат в данных временных рядов - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь построить линейный график с данными нескольких временных рядов, где каждая строка показывает тенденции продаж для определенного объекта в течение одной и той же даты начала и окончания. Мой набор данных уже находится в «расплавленном» виде и выглядит так:

'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

Ниже приведены ТАК сообщения, которые я просмотрел безрезультатно: 1. Несколько влайнов на графике дают ошибку, ggplot2 2. ggplot2: как добавить текст в несколько вертикальных линий (geom_vlines) на оси времени X? 3. Как получить вертикальную geom_vline для оси X даты класса?

3 подходит очень близко, но моя переменная x относится к классу Date, а не int, поэтому не могу заставить ее работать.

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 24 мая 2019

Вам нужно поместить 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 выбранные важные даты, представленные в виде вертикальных линий.

...