【问题标题】:Animating two layers in gganimate with different timesteps用不同的时间步在 gganimate 中为两层设置动画
【发布时间】:2019-03-06 10:20:48
【问题描述】:

我正在使用 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 是静态的,则上述代码可以完美运行。我附上了两个数据文件的链接,其中包含与上述代码一起使用的假数据,并重现了我遇到的问题datafiles

【问题讨论】:

  • sumDur 变量到底是什么?
  • 它是在给定小时内在水下花费的时间

标签: r ggplot2 gganimate


【解决方案1】:

在我的机器上,您的代码运行没有问题。如果您的datetime 格式正确,则日期transition_time() 将填补您数据点之间的所有空白:

plot <- ggplot() + 
    geom_raster(data = Prey, aes(x = lon, y = lat, fill = energy)) +
    scale_fill_viridis_c() +
    geom_point(data = Tracks, aes(x = lon, y = lat, size = sumdur)) +
    transition_time(datetime) +
    ease_aes("linear") +
    labs(title="{frame_time}", x="Longitude", y="Latitude")

animate(plot, nframes = 100)

数据

【讨论】:

  • hmm..我将日期时间(称为 gmt)格式化为 POSIXct 对象,但时间似乎仍然不匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2014-08-31
  • 1970-01-01
  • 2012-11-12
  • 2015-03-31
相关资源
最近更新 更多