R中使用gganimate绘制cartogram动画时出现旧API错误如何解决
问题原因
你遇到的报错是因为当前安装的是新版gganimate,而你用的还是v0.1.1版本的旧API语法:旧版通过aes()中的frame参数指定帧维度,用gganimate()函数直接传入ggplot对象导出动画,这些用法都已经被废弃。另外你的数据准备部分存在逻辑错误,就算修正API也无法得到正确的变形过渡效果。
修正步骤
1. 修正数据源准备逻辑
你当前代码中cartogram_df和cartogram_data_df都是基于原始地图对象cartogram_data生成的,没有用到你已经计算好的cartogram变形结果cartogram_plot,两个数据完全一致,自然不会有过渡效果,替换为以下代码:
# 原始等值面地图数据(未变形) cartogram_data_df <- broom::tidy(cartogram_data) %>% dplyr::left_join(cartogram_data@data, by=c("id"="ISO3")) # 变形后 cartogram 地图数据(注意这里传入的是你计算好的变形结果) cartogram_df <- broom::tidy(cartogram_plot) %>% dplyr::left_join(cartogram_data@data, by=c("id"="ISO3"))
这部分改完之后,你之前用tweenr生成过渡帧的代码不用修改,可以正常使用。
2. 适配新版gganimate API调整绘图代码
删掉aes()里的frame=.frame参数,新增transition_manual(.frame)指定按提前生成好的.frame列切换帧,gganimate会自动处理每帧的筛选逻辑:
africa_plt <- ggplot() + geom_polygon(data = dt %>% arrange(order) , aes(fill = POP2005/1000000, x = long, y = lat, group = group) , size=0, alpha=0.9) + theme_void() + scale_fill_viridis( name="Population (M)", breaks=c(1,50,100, 140), guide = guide_legend( keyheight = unit(3, units = "mm"), keywidth=unit(12, units = "mm"), label.position = "bottom", title.position = 'top', nrow=1) ) + labs( title = "Africa", subtitle="Population per country in 2005" ) + ylim(-35,35) + theme( text = element_text(color = "#22211d"), plot.background = element_rect(fill = "#f5f5f4", color = NA), panel.background = element_rect(fill = "#f5f5f4", color = NA), legend.background = element_rect(fill = "#f5f5f4", color = NA), plot.title = element_text(size= 22, hjust=0.5, color = "#4e4d47", margin = margin(b = -0.1, t = 0.4, l = 2, unit = "cm")), plot.subtitle = element_text(size= 13, hjust=0.5, color = "#4e4d47", margin = margin(b = -0.1, t = 0.4, l = 2, unit = "cm")), legend.position = c(0.2, 0.26) ) + coord_map() + # 新增:指定按.frame列逐帧切换 transition_manual(.frame)
3. 导出动画
删掉原来的gganimate()调用,用新版anim_save()函数直接导出gif即可:
# duration参数控制动画总时长,单位为秒,可按需调整 anim_save("Animated_Africa.gif", africa_plt, duration = 5)
如果导出时提示缺少gifski依赖,先运行install.packages("gifski")安装渲染器后再执行导出即可。
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

