如何使用gganimate制作不同年份的动画ggplot

时间:2019-03-22 00:28:08

标签: r ggplot2 gganimate

所以我有一个简单的数据框,其中第一列包含道路ID,接下来的10列包含10年以上每个道路ID的交通量。
我一直在努力想出一个代码,在X轴上显示道路ID,在Y轴上显示交通量。然后对图形进行动画处理(Y轴上的交通流量发生变化)。这是我的数据框示例:

Sample Data

有人可以建议一段代码来做到这一点吗?这是我编写的代码,但实际上没有用。我知道这可能是非常错误的,但是我是刚开始做动画的人,不确定是否可以使用不同的功能。任何帮助表示赞赏。

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 个答案:

答案 0 :(得分:1)

大多数工作都在于更改数据,然后再将其发送到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

现在剩下的事情很简单了。只需绘制数据,然后将year变量用作animation参数即可。

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-这是通过filter命令完成的。
据我所知,截至2019年3月23日,动画只能一次播放一次。您可以更改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