Конечный результат
Код
library(ggplot2)
library(ggmap)
library(gganimate)
ggm <- ggmap(europe) +
geom_point(data = events,
aes(x = Lon, y = Lat,
colour = ID, group = ID, shape = Event),
size = 3, alpha = 0.8) +
transition_time(Date) +
labs(title = paste("Day", "{round(frame_time,0)}")) +
shadow_wake(wake_length = 0.1)
animate(ggm, fps = 24, duration = 16)
==============================================================
Шаг за шагом
У вас там много движущихся частей.Давайте разберем это немного:
0.Загрузка библиотек
library(ggplot2)
library(ggmap)
library(gganimate)
library(ggrepel) # will be useful for data exploration in step 1
1.Исследование данных
ggplot(data = events, aes(x = ID, y = Date, colour = Event)) +
geom_point()
Мы видим, что события прилета и вылета достаточно близки для каждого самолета.Кроме того, между ними всегда есть разрыв в пару дней.Это кажется разумным.
Давайте проверим переменную Date
:
> length(unique(events$Date))
[1] 24
> min(events$Date)
[1] 2
> max(events$Date)
[1] 33
Хорошо, это означает две вещи:
- Наши точки данных расположены неравномерно.
- У нас нет данных для всех
Date
с.
Обе вещи сделают анимацию довольно сложной.
ggplot(data = unique(events[, 4:5]), aes(x = Lon, y = Lat)) +
geom_point()
Кроме того, у нас есть только 11 уникальных мест (== аэропортов).Это, вероятно, приведет к дублированию данных.Давайте построим это по дням:
ggplot(data = unique(events[, 3:5]), aes(x = Lon, y = Lat, label = Date)) +
geom_point() +
geom_text_repel()
Да, это будет весело ... Много вещей происходит в этом аэропорту посередине.
2.Базовая анимация
gga <- ggplot(data = events, aes(x = Lon, y = Lat)) +
geom_point() +
transition_time(Date)
animate(gga)
Мы использовали transition_time()
, а не transition_states()
, потому что первый используется для линейных переменных времени (например, секунда, день, год) и автоматической интерполяции, в то время как последний дает больше ручного управления пользователю.
3.Давайте добавим цвет
gga <- ggplot(data = events, aes(x = Lon, y = Lat, colour = ID)) +
geom_point() +
transition_time(Date)
animate(gga)
Это начинает выглядеть как-то!
4.Добавьте заголовок, прозрачность, увеличьте размер
gga <- ggplot(data = events, aes(x = Lon, y = Lat, col = ID)) +
geom_point(size = 3, alpha = 0.5) +
transition_time(Date) +
labs(title = paste("Day", "{round(frame_time, 0)}"))
Обратите внимание на округление {round(frame_time, 0)}
.Попробуйте использовать {frame_time}
и посмотрите, что получится!
5.Добавьте немного пиццы
gga <- ggplot(data = events, aes(x = Lon, y = Lat, col = ID, group = ID,
shape = Event)) +
geom_point(size = 3, alpha = 0.5) +
transition_time(Date) +
labs(title = paste("Day", "{round(frame_time, 0)}")) +
shadow_wake(wake_length = 0.05)
animate(gga)
Выглядит хорошо, давайте закончим!
6.Добавьте карту, сделайте анимацию медленнее, настройте некоторые детали
ggm <- ggmap(europe) +
geom_point(data = events,
aes(x = Lon, y = Lat,
colour = ID, group = ID, shape = Event),
size = 3, alpha = 0.8) +
transition_time(Date) +
labs(title = paste("Day", "{round(frame_time,0)}")) +
shadow_wake(wake_length = 0.1)
animate(ggm, fps = 24, duration = 16)
Не слишком потертый, а?Примечание: animate(ggm, nframes = 384)
имел бы такой же эффект на анимацию, что и fps = 24
с duration = 16
.
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь, напишите мне комментарий.Я сделаю все возможное, чтобы помочь или прояснить ситуацию.