R使用gganimate的transition_layers时动画标题过早切换如何解决
问题原因
该问题是transition_layers和animate()的end_pause参数的时间线匹配逻辑导致的:end_pause追加的停顿帧不属于transition_layers原本定义的图层过渡时间区间,因此closest_layer变量会默认回退到第一个图层的取值,就出现了画面仍为第二层、标题已切回第一层的问题。
解决方案
- 方案一:调整
transition_layers的时长参数,替换end_pause
无需使用end_pause,直接通过transition_layers自带的layer_length、transition_length参数控制各图层的展示时长、过渡时长,将第二层的停留时间拉长,此时closest_layer的取值会和画面完全匹配,示例代码如下:
library(gganimate) library(ggplot2) ## data df = data.frame(x=c(0,1), y=c(0,1)) ## static plot g = ggplot(data=df, aes(x=x, y=y))+ geom_point()+ geom_line()+ labs(title = '{closest_layer}') ## animated plot gg = g + transition_layers( layer_names = c('Layer 1: Points', 'Layer 2: Line'), layer_length = c(1, 2.5), # 第二个图层的静态展示时长为第一个的2.5倍 transition_length = 1 # 两个图层之间的过渡时长 ) + enter_fade() a = animate(gg, nframes = 50) a
- 方案二:硬编码标题逻辑,保留
end_pause设置
如果你不想调整原有过渡参数,需要保留end_pause,可以直接在标题的字符串模板里加入帧序号判断,强制停顿阶段显示第二层的标题,示例代码如下:
library(gganimate) library(ggplot2) ## data df = data.frame(x=c(0,1), y=c(0,1)) ## static plot g = ggplot(data=df, aes(x=x, y=y))+ geom_point()+ geom_line()+ # 总帧50,end_pause=20,因此后20帧属于第二层停顿阶段,强制对应标题 labs(title = '{if (as.integer(frame) > 30) "Layer 2: Line" else closest_layer}') ## animated plot gg = g + transition_layers(layer_names=c('Layer 1: Points', 'Layer 2: Line')) + enter_fade() a = animate(gg, nframes = 50, end_pause = 20) a
内容的提问来源于stack exchange,提问作者bmacGTPM
相关产品推荐
相关产品推荐

