使用gganimate实现geom_bar逐根显示且保留已出现柱形的方案咨询
gganimate柱形图逐根出现并保留已展示柱形的解决方案
原有代码的问题在于transition_states默认只会渲染当前状态匹配的观测值,非当前状态的元素会被自动淡出。要实现已展示柱形保留的效果,有两种常用实现方式:
方案1:最小改动,直接添加shadow_mark层
仅需在原有代码基础上新增一行shadow_mark()配置即可:
library(ggplot2) library(gganimate) a <- data.frame(group=c("A","B","C"), values=c(3,2,4), frame=rep('a',3)) b <- data.frame(group=c("A","B","C"), values=c(5,3,7), frame=rep('b',3)) df1 <- rbind(a,b) Plot1 <- ggplot(data= df1, aes(x = group, y = values, fill = group)) + geom_bar(stat='identity') + theme_bw() + transition_states( states = group , transition_length = 2 , state_length = 1 ) + # 保留已出现的历史元素,不展示未到状态的未来元素 shadow_mark(past = TRUE, future = FALSE) Plot1
方案2:构造累积数据集,灵活控制动画逻辑
如果需要后续扩展动画逻辑(比如柱形全部出现后再统一更新数值),可以预先构造每帧需要展示的全量数据:
library(ggplot2) library(gganimate) # 构造每帧的全量展示数据:第n帧包含前n个组的所有数据 base_df <- data.frame(group=c("A","B","C"), values=c(3,2,4)) df_accum <- do.call(rbind, lapply(1:nrow(base_df), function(i){ cbind(base_df[1:i, ], frame_id = i) })) Plot2 <- ggplot(df_accum, aes(x = group, y = values, fill = group)) + geom_bar(stat = "identity") + theme_bw() + transition_states( states = frame_id, transition_length = 2, state_length = 1 ) Plot2
内容的提问来源于stack exchange,提问作者MYaseen208
相关产品推荐
相关产品推荐

