我正在使用 gganimate 将动物跟踪数据叠加在猎物可用性之上,两者都通过时间动画显示动物的运动如何随着猎物可用性的变化而变化。
跟踪数据集由一个
- sumDur 变量
- 纬度和经度
- 每隔一小时
猎物数据集包括
- 能量值
- 纬度和经度
- 每周一次
数据框示例
head(Tracks)
sumDur lon2 lat gmt
30641 0.0000000 -170.2978 57.10774 2004-08-18 05:05:00
29380 0.0000000 -170.3264 57.05684 2004-08-18 06:00:00
29381 10.0833333 -170.3565 57.00376 2004-08-18 07:00:00
29382 3.0833333 -170.3859 56.95370 2004-08-18 08:00:00
29383 0.8333333 -170.4147 56.90687 2004-08-18 09:00:00
29384 2.6666667 -170.4429 56.86301 2004-08-18 10:00:00
head(Prey)
# A tibble: 6 x 4
TotalEnergyM2 lat lon2 gmt
<dbl> <dbl> <dbl> <dttm>
1 0 50 160 2004-01-01 00:00:00
2 0 50 162. 2004-01-01 00:00:00
3 0.0000193 50 180. 2004-01-01 00:00:00
4 0 50.3 -151. 2004-01-01 00:00:00
5 38.3 53.9 -158 2004-01-01 00:00:00
6 31.4 53.9 -158. 2004-01-01 00:00:00
目标
我已经能够成功地在静态环境之上为跟踪数据设置动画,并且还可以在没有跟踪数据的情况下为猎物数据设置动画。
我的问题在于尝试为两者创建一个动画 - 我得到一个动画,但即使我知道时间重叠,每个动画的时间也不正确。
我相信这是由于我的时间列(gmt)的帧长度在每个数据帧中都不相同;在我的跟踪数据框中,时间步长是一小时,而在猎物数据框中,时间步长是一周。不幸的是,我无法验证这一点,因为猎物数据帧太大而无法将其复制到每小时的时间步长。我玩过一些不同的转换(例如transition_state
),但没有成功,也无法在这里或其他地方找到任何解决方案。
如果我没有提供足够的信息或格式已关闭,任何帮助将不胜感激并提前道歉 - 这是我的第一篇文章。
示例代码
plot <- ggplot(NULL) +
geom_raster(data=Prey, aes(x=lon2, y=lat2, fill=TotalEnergyM2) +
geom_point(data=Tracks, aes(x=lon2, y=lat2, size=sumDur)) +
scale_fill_viridis_c()+
transition_time(gmt)+
ease_aes("linear")+
labs(title="{frame_time}", x="Longitude", y="Latitude")
animate(plot)
如果我注释掉 geom_raster 或 geom_point 以便获得单独的动画,或者 geom_raster 是静态的,则上面的代码可以完美运行。我附上了两个数据文件的链接,其中包含与上述代码一起使用的假数据,并重现了我遇到数据文件的问题。