Я не был уверен, как сделать это полностью в рамках 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)
... или с view_follow(fixed_y = TRUE)
:
(Обратите внимание, что для значений 10 Кб будет выглядеть лучше разделить на большее количество кадров для более плавного перемещения, но это приведет к созданию файла большего размера, чем я мог бы прикрепить здесь.)