tweenr / gganimate与时间序列线图

时间:2018-01-08 23:58:47

标签: r ggplot2 tween gganimate

首先我为一个非常简单的时间序列线图创建了一个动画图...一些示例数据:

library(dplyr)
library(gganimate)
library(tweenr)

data <- tribble(
  ~year, ~num,
  1950, 56,
  1951, 59,
  1952, 64,
  1953, 67,
  1954, 69,
  1955, 74,
  1956, 78,
  1957, 83
)

dat_ani <- data %>% 
  ggplot(aes(x = year, y = num, frame = year, cumulative = TRUE)) +
  geom_path() +
  geom_point()

gganimate(dat_ani)

所以,只使用gganimate就可以了,但我希望通过使用tweenr进行更平滑的过渡来更进一步。

知道tweenr如何使用插值我想要一个类似于上面的数据框但是看起来更接近于此(仅在1950年到1951年之间):

data2 <- tribble(
  ~year, ~num,
  1950.0, 56.0,
  1950.1, 56.3,
  1950.2, 56.6,
  1950.3, 56.9,
  1950.4, 57.2,
  1950.5, 57.5,
  1950.6, 57.8,
  1950.7, 58.1,
  1950.8, 58.4,
  1950.9, 58.7,
  1951.0, 59.0,
)

但具有所有其他插值年份和数据点。我尝试了另一种使用tween_elements()函数的方法但是没有用(我认为因为x,time和id都是相同的变量......)。

我对如何创建这些数据框的列表以用作tween_states()函数的输入感到困惑。 我试过了:

df_fun <- function(i) {
  dat <- data %>% subset(data$year[i])
  return(dat)
}

df_list <- purrr::map(seq(1950, 1957, by = 0.2), df_fun)

tween_data <- tween_states(df_list, tweenlength = 2, statelength = 3, 
                                             ease = "linear", nframes = 200)

除了其他尝试之外,当然这不起作用,因为原始数据框中没有年份== 1950.2,1950.4等......

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

如果有其他人感兴趣,我发布在RStudio社区并能够在那里找到答案:

https://community.rstudio.com/t/tweenr-gganimate-with-line-plot/4027/5?u=r-by-ryo

library(tidyverse)

data <- tribble(
  ~year, ~num,
  1950, 56,
  1951, 59,
  1952, 64,
  1953, 67,
  1954, 69,
  1955, 74,
  1956, 78,
  1957, 83
)

dat_ani <- map(seq(nrow(data)), ~data[c(seq(.x), rep(.x, nrow(data) - .x)), ]) %>% 
    tweenr::tween_states(5, 2, 'cubic-in-out', 100) %>% 
    ggplot(aes(year, num, frame = .frame)) + 
    geom_path() + 
    geom_point()

animation::ani.options(interval = 0.05)    # speed it up
gganimate::gganimate(dat_ani, title_frame = FALSE)
  

地图调用会生成一个列表,其中每行的数据框与数据的观察次数相同,但尚未显示的行将替换为最后显示的行。现在,tweenr :: tween_states可以跟踪每个点应该移动的位置,这样可以平滑地插入。

在RStudio社区论坛上归功于 alistaire