是否有保留旧柱并添加新柱的过渡功能? Transition_reveal 只移动单数条

Is there a transition function to keep old bars and add on new ones? Transition_reveal just moves the singular bar

试图做到这一点,以便我可以为 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)

您需要通过在 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)