animated-2d-point-maps-alt.R
library(tidyverse)
library(dplyr)
library(gganimate)
library(ggplot2)
library(sf)
read_hourly_data <- function(hour) {
hour_log <- read_csv(sprintf("flight_hours/states_2022-06-27-%02d.csv/states_2022-06-27-%02d.csv", hour, hour),
show_col_types = FALSE)
hour_log$time <- as_datetime(hour_log$time)
hour_log$time <- floor_date(hour_log$time, "5 minutes")
hour_log <- hour_log |>
filter(!onground) |>
filter(!is.na(lat)) |>
filter(!is.na(lon)) |>
filter(!is.na(velocity)) |>
group_by(icao24, time) |>
arrange(desc(icao24)) |>
slice_head(n=1)
}
five_minute_flight <- read_hourly_data(0)
five_minute_flight_AAL <- five_minute_flight |>
filter(startsWith(callsign, "AAL"))
five_minute_flight_AAL_line <- five_minute_flight_AAL |>
mutate(lon2 = lon - velocity*cos((90-heading) * pi/180)/100) |>
mutate(lat2 = lat - velocity*sin((90-heading) * pi/180)/100) |>
mutate(geom = sprintf("LINESTRING(%f %f, %f %f)", lon, lat, lon2, lat2)) |>
st_as_sf(wkt = "geom") |>
st_set_crs(4326)
five_minute_flight_AAL_point <- five_minute_flight_AAL |>
st_as_sf(coords=c("lon","lat")) |>
st_set_crs(4326)
usa <- st_as_sf(maps::map("state", fill=TRUE, plot=FALSE))
animation <- ggplot(usa) +
geom_sf(color = "#2b2b2b", fill = "white", size=0.125)+
geom_sf(data=five_minute_flight_AAL_point, size=1, alpha=0.6, aes(group = icao24))+
geom_sf(data=five_minute_flight_AAL_line, size=1, alpha=0.6, aes(group = icao24))+
theme_void()+
labs(title="American Airlines Flights Over A 24-hour Period",
subtitle="{format(frame_time, \"%I:%M %p\")} EST",
caption="Nikhil Chinchalkar for Princeton University | Open Sky Network | 2024")+
ylim(25,50)+
xlim(-135,-65)+
xlab('')+
ylab('')+
theme(plot.title = ggtext::element_markdown(size = 22, hjust =0.5, face = "bold"),
plot.subtitle = ggtext::element_markdown(size = 16, hjust =0.5, face = "bold"))+
transition_time(time)+
enter_fade(alpha = 0)+
exit_fade(alpha = 0)
animate(animation, fps=15, duration=20, end_pause = 75, height = 7,
width = 9, units = "in", res = 200)
Last updated