Анимационный сюжет временного ряда ggplot с раздвижным окном - PullRequest
5 голосов
/ 06 апреля 2019

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

Предположим, у меня есть следующее:

  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 Ответ

11 голосов
/ 08 апреля 2019

Я не был уверен, как сделать это полностью в рамках view_* в gganimate, но вот подход, использующий немного ручной подготовки. Я копирую фрейм данных для каждого фрейма, который хочу показать, и затем фильтрую по точкам данных, которые я хочу видеть в каждом фрейме. 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

(Обратите внимание, что для значений 10 Кб будет выглядеть лучше разделить на большее количество кадров для более плавного перемещения, но это приведет к созданию файла большего размера, чем я мог бы прикрепить здесь.)

...