使用gganimate制作时序动画时如何跳过缺失的2020年?
解决gganimate显示缺失年份帧的问题
问题出在transition_time()的工作逻辑上:它是为连续时间变量设计的,会自动在数据的最小年份和最大年份之间插值生成所有时间点的帧——哪怕你的数据里没有2020年,它也会补出这个时间点的帧,同时对数据点做线性插值,导致出现大量额外点。调整nframes或exit_disappear()都改变不了这个插值逻辑,所以没用。
给你两种可行的修改方案:
方案1:用离散状态处理年份(推荐)
把年份转成因子类型,改用transition_states()处理离散状态,这样只会生成数据中存在的年份的帧:
# 先把Year转成因子,限定为数据中存在的年份 metadata$Year <- factor(metadata$Year, levels = sort(unique(metadata$Year))) # 重新构建图层 with_data <- basemap + geom_point(data = metadata, aes(x = `LonDD.v2`, y = `LatDD`, color = `repunit`))+ facet_wrap(~repunit)+ scale_color_manual(values = pal_species) # 用transition_states替代transition_time map_with_animation <- with_data + transition_states(Year, transition_length = 0, state_length = 1) + ggtitle('Year: {closest_state}') # 帧数设为数据中存在的年份数量 num_years <- length(unique(metadata$Year)) animate(map_with_animation, nframes = num_years, fps = 1)
transition_length = 0:去掉年份间的过渡动画,只保留每个年份的静态帧closest_state:显示当前帧对应的实际年份,不会出现缺失的2020年
方案2:限定transition_time的帧为存在的年份
如果想保留transition_time(),可以直接指定要生成的帧为数据中存在的年份,跳过插值:
# 获取数据中实际存在的年份 existing_years <- sort(unique(metadata$Year)) map_with_animation <- with_data + transition_time(Year) + ggtitle('Year: {frame_time}') # 用frames参数指定具体年份,而非自动插值 animate(map_with_animation, frames = existing_years, fps = 1)
内容的提问来源于stack exchange,提问作者awray
相关产品推荐
相关产品推荐

