首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用滑动窗口对ggplot时间序列图进行动画处理

使用滑动窗口对ggplot时间序列图进行动画处理
EN

Stack Overflow用户
提问于 2019-04-06 12:18:44
回答 1查看 1K关注 0票数 6

我正在寻找在不降低分辨率的情况下制作长时间序列图的动画的方法。我希望视图在整个数据上“平移”,从头到尾显示它的一个滑动子集。

假设我有以下内容:

代码语言:javascript
复制
  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()

我想创建一个动画,通过一次只关注数据的一部分来显示更多细节,并从头到尾滑动。想象一下,通过放大镜观察这个系列,同时将情节滑到下面……这就是我想要达到的效果。可以通过gganimate实现吗?如果没有,有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-09 01:12:54

我不确定如何完全在gganimate的view_*框架中完成这项工作,但这里有一种方法,需要一些手动准备。我为我想要显示的每个帧复制数据帧,然后过滤到我希望每个帧看到的数据点。gganimate::view_follow将每个帧的视图范围设置为仅显示该帧的数据。

代码语言:javascript
复制
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)的...or:

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55545855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档