我正在尝试使用gganimate为涵盖90年的数据集创建一个GIF,也就是说,我想让一个GIF运行到90个州/年。然而,gganimate似乎只能处理少于50个州。
下面是一个例子:
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年来,这一切都很好:
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年(或更多)的时间,情况会变得很奇怪:
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?
发布于 2018-09-16 08:50:47
这与gganmiate在动画中使用100帧的固定数量有关。长达50年(请注意,1670:1719的长度为50,而不是49),这是正常的,但如果您想要绘制更多的年份,您需要更多的帧。您可以通过显式调用animate()来控制帧数。
对于您的示例,这意味着您首先应该将您的绘图存储在一个变量中:
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)然后,您可以通过键入以下任意一个来启动动画
p
animate(p)
animate(p, nframes = 100)这三条线是等价的。第一个是您在示例中所做的工作:这将隐式调用animate()来呈现动画。第二行显式地调用animate(),第三行还显式地将帧数设置为100。由于nframes = 100是默认值,这最后一行的操作也与其他行相同。
为了使动画工作,您需要设置更多的帧。100帧工作50年,因此182帧应该工作91年在您的完整数据框架。同样,以下两行是相同的:
animate(p, nframes = 182)
animate(p, nframes = 2 * length(unique(df$year)))现在它起作用了:

我不确定为什么您需要的帧数是几年前的两倍,但是在阅读了transition_states()文档中的以下语句之后
然后,它在定义的状态之间发出吐温,并在每个状态下暂停。
我猜想,一个框架用于两年之间的过渡,一个框架用于表示某一年的日期。
这意味着您实际上需要一个帧,比年数的两倍还少,因为去年之后的转换不需要任何框架。实际上,gganimate()为nframes = 100和nframes = 182提供的输出分别是:
Frame 99 (100%)
Finalizing encoding... done!
Frame 181 (100%)
Finalizing encoding... done!因此,如果我的猜测是正确的,它确实是在创造预期的帧数。
https://stackoverflow.com/questions/52332967
复制相似问题