gganimate动画未停在设定值:堆叠条形图异常跳转问题求助
问题原因及解决方法
问题根源
你做的堆叠条形图动画没停在设定值67反而继续跳转,核心原因有两个:
- 多余填充行导致帧混乱:你把
value补到了100行,后面33行的value都是67,但blue_nr是反转整个100行的gold_nr得到的——这意味着这33行的blue_nr会从67一直降到1,对应堆叠比例不断变化,动画自然会继续播放这些额外帧,不会停在你想要的67状态。 - 过渡参数选错:用
transition_manual(value)时,相同value值的行会被当作不同帧播放,而你后面33行都是value=67,但blue_nr不同,所以动画会继续迭代这些行,导致比例跳转。
调整方案(两种可选)
方案一:去掉多余填充行(最直接)
既然你的目标是value到67就停止变化,完全不需要把数据补到100行。修改后代码如下:
library(tidyverse) library(gganimate) # 只保留需要的1-67行数据 time = 1:67 value = 1:67 df <- tibble(time = time, value = value, x = "A") %>% mutate(gold_nr = value) %>% # 直接反转value向量,不用管补全的行 mutate(blue_nr = rev(value)) %>% pivot_longer(c(gold_nr, blue_nr), names_to = "color_group", values_to = "value_group") # 改用time作为过渡依据,确保每帧对应一个时间点 p <- df %>% ggplot(aes("", value_group, fill=color_group)) + geom_col(width = 0.3, position = position_fill())+ scale_fill_manual(values = c("gold", "steelblue"))+ theme_minimal()+ transition_manual(time)+ coord_flip() animate(p, fps=24, renderer = gifski_renderer(loop = FALSE))
方案二:保留100行但固定后续帧状态
如果你一定要保留100行的time,希望从67到100时堆叠状态不变,需要修改blue_nr的生成逻辑,让后面33行的blue_nr等于第67行的值:
library(tidyverse) library(gganimate) time=1:100 value = 1:67 fill = rep(max(value), 100-max(value)) df <- tibble(time = time, value = c(value, fill), x = "A") %>% mutate(gold_nr = value) %>% # 先生成反转的完整向量,再把68-100行的blue_nr替换成第67行的值 mutate(blue_nr = rev(c(value, fill))) %>% mutate(blue_nr = ifelse(time > 67, blue_nr[67], blue_nr)) %>% pivot_longer(c(gold_nr, blue_nr), names_to = "color_group", values_to = "value_group") p <- df %>% ggplot(aes("", value_group, fill=color_group)) + geom_col(width = 0.3, position = position_fill())+ scale_fill_manual(values = c("gold", "steelblue"))+ theme_minimal()+ transition_manual(time)+ coord_flip() animate(p, fps=24, renderer = gifski_renderer(loop = FALSE))
这样动画到time=67后,堆叠比例就会固定下来,不会再跳转。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

