使用滑动窗口为ggplot时间序列图制作动画

时间:2019-04-06 04:18:44

标签: r ggplot2 time-series gganimate

我正在寻找在不损失分辨率的情况下为长时间序列图制作动画的方法。我希望视图在数据之间“平移”,以显示从头到尾的滑动子集。

假设我有以下内容:

  library(ggplot2)
  library(dplyr)
  library(gganimate)

  df <- as.data.frame(cumsum(rnorm(1:10000))) %>% rename(y = 1)
  df <- mutate(df, seq = seq(1, 10000, by = 1))

  ggplot(df, aes(x = seq, y = y)) + 
    geom_line()

enter image description here

我想创建一个动画,以显示更多细节,方法是一次只关注数据的一部分,然后从头到尾滑动。想象一下通过放大镜放大该系列,同时在下方滑动图...这就是我要达到的效果。是否可以通过gganimate?如果没有,有什么建议吗?

1 个答案:

答案 0 :(得分:11)

我不确定如何完全在gganimate的view_*框架内完成此操作,但这是一种使用一些手动准备工作的方法。我复制要显示的每个帧的数据帧,然后过滤到希望每个帧看到的数据点。 gganimate::view_follow设置每个框架的查看范围,使其仅显示该框架的数据。

library(tidyverse)
library(gganimate)
df <- as.data.frame(cumsum(rnorm(1:10000))) %>% rename(y = 1)
df <- mutate(df, seq = seq(1, 10000, by = 1))

window_width = nrow(df)/5  # How much of the whole data to show at once
frames = 200   # Increase to make smoother animation & bigger file
shift_per_frame = (nrow(df) - window_width) / frames

# This bit of purrr copies the whole data frame [frames] times, identifying each with "id"
df_copied <- map_df(seq_len(frames), ~df, .id = "id") %>%
  mutate(id = as.integer(id)) %>%
  filter(seq >= id * shift_per_frame,
         seq <= id * shift_per_frame + window_width)

a <- ggplot(df_copied, aes(x = seq, y = y)) + 
  geom_line() +
  transition_manual(id) +
  view_follow()

animate(a, nframes = frames)

enter image description here

...或使用view_follow(fixed_y = TRUE)enter image description here

(请注意,对于10k值,最好细分为更多的帧以使移动更平滑,但这会使文件比我在此处附加的要大。)