我正在尝试这样做,这样我就可以在R中将条形图逐个添加到条形图中。我知道有一个名为transition_layers的函数,但在我的一生中一直无法使用它。在下面的可重复示例中,我让条形图随着时间的推移而移动,但我想要的是随着时间的推移一个接一个地添加新的条形图,并让每个较旧的条形图保持不变。
库:
library(magrittr)
library(broom)
library(purrr)
library(gganimate)
library(gifski)
library(ggthemes)
library(png)
library(jpeg)
library(ggimage)
library(grid)
Cost <- c(1, 2, 4)
Year <- c(2016, 2017, 2018)
example <- data.frame(Year, Cost)
example_bar <-ggplot(data = example, mapping = aes(Year))+
geom_bar(aes(weight = Cost))+
theme_stata()+
transition_reveal(Year)发布于 2021-01-13 05:14:16
您需要通过在geom_col中设置group=Year来显式地告诉gganimate x轴上的每一列都在不同的组中(我将geom_bar更改为geom_col,因为我认为它更直观,但这基本上是一样的)。否则,gganimate会将它们全部视为同一组,并且该列将沿x轴滑动。对于其他类型的动画,我以前也遇到过这种情况。显式设置group参数通常是个好主意。
ggplot(data = example)+
geom_col(aes(x=Year, y = Cost, group=Year)) +
transition_reveal(Year)
anim_save(filename = 'gif1.gif', anim1, nframes=30, fps=10, end_pause=5)

但是,我无法使用transition_reveal设置转换时间和配置新列的显示方式。动画看起来很奇怪,每一列都在另一列之前停留了很长一段时间。我可以用animate/anim_save把它做得更好一点……
因此,另一种解决方案是通过保留“过去”行来更改数据框,使用当前年份创建一个新列,并使用transition_states
library(dplyr)
df.2 <- plyr::ldply(.data= example$Year,
.fun = {function(x){
example %>% dplyr::filter(Year <= x) %>%
dplyr::mutate(frame=x)}})
# add row with data for dummy empty frame
df.2 <- rbind(data.frame(Year=2016, Cost=0, frame=2015), df.2)
anim2 <- ggplot(data = df.2) +
geom_col(aes(x=Year, y = Cost, group=Year)) +
transition_states(frame, transition_length = 2, state_length = 1, wrap=FALSE) +
enter_fade() + enter_grow()
anim_save(filename = 'gif2.gif', anim2)

https://stackoverflow.com/questions/65678281
复制相似问题