首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gganimate中许多(>50)态的问题

gganimate中许多(>50)态的问题
EN

Stack Overflow用户
提问于 2018-09-14 13:22:37
回答 1查看 2.5K关注 0票数 10

我正在尝试使用gganimate为涵盖90年的数据集创建一个GIF,也就是说,我想让一个GIF运行到90个州/年。然而,gganimate似乎只能处理少于50个州。

下面是一个例子:

代码语言:javascript
复制
library(tidyverse)
# devtools::install_github('thomasp85/gganimate')
library(gganimate)

df = expand.grid(  x = 1,
                   y = c(2,3),
                year = 1670:1760) %>% mutate( z = 0.03* year,
                                              u = .2 * year)

49年来,这一切都很好:

代码语言:javascript
复制
ggplot(data=df %>% filter(., year %in% 1670:1719) , aes()) + 
  geom_point( aes(x = x, y = y, fill = z, size = u), shape = 21 ) + 
  labs( title = 'Year: {closest_state}') +
  enter_appear() +
  transition_states(year, transition_length = 1, state_length = 2) 

然而,如果我包括了50年(或更多)的时间,情况会变得很奇怪:

代码语言:javascript
复制
ggplot(data=df %>% filter(., year %in% 1670:1720) , aes()) + 
  geom_point( aes(x = x, y = y, fill = z, size = u), shape = 21 ) + 
  labs( title = 'Year: {closest_state}') +
  enter_appear() +
  transition_states(year, transition_length = 1, state_length = 2) 

我怎样才能为整个90年创建一个GIF呢?任何想法都欢迎!

我还是gganimate的新手,我是不是不正确地使用transition_states

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-16 08:50:47

这与gganmiate在动画中使用100帧的固定数量有关。长达50年(请注意,1670:1719的长度为50,而不是49),这是正常的,但如果您想要绘制更多的年份,您需要更多的帧。您可以通过显式调用animate()来控制帧数。

对于您的示例,这意味着您首先应该将您的绘图存储在一个变量中:

代码语言:javascript
复制
p <- ggplot(df) + 
      geom_point(aes(x = x, y = y, fill = z, size = u), shape = 21) + 
      labs( title = 'Year: {closest_state}') +
      enter_appear() +
      transition_states(year, transition_length = 1, state_length = 2)

然后,您可以通过键入以下任意一个来启动动画

代码语言:javascript
复制
p
animate(p)
animate(p, nframes = 100)

这三条线是等价的。第一个是您在示例中所做的工作:这将隐式调用animate()来呈现动画。第二行显式地调用animate(),第三行还显式地将帧数设置为100。由于nframes = 100是默认值,这最后一行的操作也与其他行相同。

为了使动画工作,您需要设置更多的帧。100帧工作50年,因此182帧应该工作91年在您的完整数据框架。同样,以下两行是相同的:

代码语言:javascript
复制
animate(p, nframes = 182)
animate(p, nframes = 2 * length(unique(df$year)))

现在它起作用了:

我不确定为什么您需要的帧数是几年前的两倍,但是在阅读了transition_states()文档中的以下语句之后

然后,它在定义的状态之间发出吐温,并在每个状态下暂停。

我猜想,一个框架用于两年之间的过渡,一个框架用于表示某一年的日期。

这意味着您实际上需要一个帧,比年数的两倍还少,因为去年之后的转换不需要任何框架。实际上,gganimate()nframes = 100nframes = 182提供的输出分别是:

代码语言:javascript
复制
Frame 99 (100%)
Finalizing encoding... done!

Frame 181 (100%)
Finalizing encoding... done!

因此,如果我的猜测是正确的,它确实是在创造预期的帧数。

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

https://stackoverflow.com/questions/52332967

复制
相关文章

相似问题

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