Как сделать анимированный ggplot для разных лет с помощью gganimate - PullRequest
1 голос
/ 22 марта 2019

Итак, у меня есть простой фрейм данных, в котором первый столбец содержит идентификаторы проезжей части, а следующие 10 столбцов содержат объемы трафика для каждого идентификатора проезжей части за 10 лет.
Я пытался придумать код для отображения идентификатора проезжей части на оси X и объем трафика на оси Y. Затем анимируйте график за несколько лет (объем трафика на оси Y меняется). Вот пример моего фрейма данных:

Sample Data

Может ли кто-нибудь предложить кусок кода, чтобы сделать это? Вот код, который я написал, но на самом деле не работает. Я знаю, что это может быть очень неправильно, но я очень плохо знаком с gganimate и не знаю, как заставить работать разные функции. Любая помощь приветствуется.

year <- c(2001,2002,2003,2004,2005,2006,2007,2008,2009,2010)

p1 <- ggplot(data = Data) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2001Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2002Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2003Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2004Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2005Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2006Traffic)) +

    geom_point(aes(x = Data$LinkIDs, y=Data$Year2007Traffic)) +  
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2008Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2009Traffic)) +
    geom_point(aes(x = Data$LinkIDs, y=Data$Year2010Traffic)) +
  labs(title = 'Year: {frame_time}', x = 'Link ID', y = 'Traffic Volume') +  
  transition_time(year)

animate(p1)

1 Ответ

1 голос
/ 22 марта 2019

Большая часть работы заключается в изменении данных перед их отправкой в ​​ggplot и gganimate.Чтобы помочь вам в этой работе, я создал несколько примеров данных на основе вашей картинки (в будущем, пожалуйста, предоставьте образцы данных самостоятельно).

library(tidyverse)
library(gganimate)

df <- tribble(
  ~LinkIDs, ~Year2001Traffic, ~Year2002Traffic, ~Year2003Traffic,
  "A", 1, 10, 15,
  "B", 3, 1, 10,
  "C", 10, 5, 1)
df
# A tibble: 3 x 4
  LinkIDs Year2001Traffic Year2002Traffic Year2003Traffic
  <chr>             <dbl>           <dbl>           <dbl>
1 A                     1              10              15
2 B                     3               1              10
3 C                    10               5               1

gganimate и ggplot лучше всего работают с данными в длинном формате.Поэтому первым шагом является изменение данных с широких на длинные, прежде чем отправлять их в ggplot.

df <- df %>% gather(Year, Traffic, -LinkIDs)
df
# A tibble: 9 x 3
  LinkIDs Year            Traffic
  <chr>   <chr>             <dbl>
1 A       Year2001Traffic       1
2 B       Year2001Traffic       3
3 C       Year2001Traffic      10
4 A       Year2002Traffic      10
5 B       Year2002Traffic       1
6 C       Year2002Traffic       5
7 A       Year2003Traffic      15
8 B       Year2003Traffic      10
9 C       Year2003Traffic       1

gganimate требует, чтобы столбец Year был числом, прежде чем он сможет использовать его для анимации.Поэтому нам нужно извлечь числа, содержащиеся в значениях.

df <- df %>% mutate(
  Year = parse_number(Year))
df
# A tibble: 9 x 3
  LinkIDs  Year Traffic
  <chr>   <dbl>   <dbl>
1 A        2001       1
2 B        2001       3
3 C        2001      10
4 A        2002      10
5 B        2002       1
6 C        2002       5
7 A        2003      15
8 B        2003      10
9 C        2003       1

Теперь все остальное просто.Просто отобразите данные и используйте переменную года для аргумента анимации.

p1 <- ggplot(df, aes(x = LinkIDs, y = Traffic))+
  geom_point()+
  labs(title = 'Year: {frame_time}', x = 'Link ID', y = 'Traffic Volume')+
  transition_time(Year)

animate(p1)

enter image description here

_________________________ РЕДАКТИРОВАТЬ ПОСЛЕ ОБНОВЛЕННЫХ КОММЕНТАРИЙ _______
Запрос вкомментарии:

«Я просто хочу, чтобы он проходил временную шкалу (с 2001 по 2003) только один раз, а затем останавливался на 2003.»

На случай, если вы захотитеостановившись на 2003 году, вам нужно будет отфильтровать данные перед отправкой их в ggplot - это делается с помощью команды фильтра.
Начиная с 23/3 2019 года, насколько я знаю, нет никакого способапройти анимацию только один раз.Вы можете изменить аргумент end_pause для вставки паузы после каждой итерации анимации (я изменил geom_point () на geom_col (), учитывая ваше описание).

p2 <- df %>% 
  #keep only observations from the year 2003 and earlier
  filter(Year <= 2003) %>% 
  #Send the data to plot
  ggplot(aes(x = LinkIDs, y = Traffic, fill = LinkIDs))+
  geom_col()+
  labs(title = 'Year: {frame_time}', x = 'Link ID', y = 'Traffic Volume')+
  transition_time(Year)  

animate(p2, fps = 20, duration = 25, end_pause = 95)

enter image description here

...