Анимация двух слоев в gganimate с разными временными шагами - PullRequest
0 голосов
/ 30 ноября 2018

Я использую 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 .

1 Ответ

0 голосов
/ 25 декабря 2018

На моей машине ваш код работает без проблем.Если ваш 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)

1

Данные

...