--- title: "`r params$storm_name` `r params$storm_year` STORM REPORT" subtitle: "Generated on: `r Sys.Date()`" format: pdf: theme: cosmo execute: warning: false message: false params: storm_basin: AL storm_year: 1900 storm_name: GALVESTON --- ```{r setup} #| echo: false library(ggplot2) library(sf) library(rnaturalearth) library(dplyr) source(file = "queries.R") storm <- list( storm_basin = params$storm_basin, storm_year = params$storm_year, storm_name = params$storm_name ) unique_lfs <- get_unique_lf_ids(storm) storm_track <- get_hurdat_track(storm) ``` ```{r track_map} #| echo: false #| fig-width: 10 #| fig-height: 8 # Add color and category classification storm_track <- storm_track %>% mutate( hurricane_category = case_when( storm_status == "HU" & windspeed >= 64 & windspeed <= 82 ~ 1, storm_status == "HU" & windspeed >= 83 & windspeed <= 95 ~ 2, storm_status == "HU" & windspeed >= 96 & windspeed <= 112 ~ 3, storm_status == "HU" & windspeed >= 113 & windspeed <= 136 ~ 4, storm_status == "HU" & windspeed >= 137 ~ 5, ), status_label = case_when( storm_status == "TD" ~ "Tropical Depression (TD)", storm_status == "TS" ~ "Tropical Storm (TS)", hurricane_category == 1 ~ "Hurricane Category 1", hurricane_category == 2 ~ "Hurricane Category 2", hurricane_category == 3 ~ "Hurricane Category 3", hurricane_category == 4 ~ "Hurricane Category 4", hurricane_category == 5 ~ "Hurricane Category 5", storm_status == "EX" ~ "Extratropical Cyclone (EX)", storm_status == "SD" ~ "Subtropical Depression (SD)", storm_status == "SS" ~ "Subtropical Storm (SS)", storm_status %in% c("LO", "WV", "DB") ~ "Low/Wave/Disturbance", TRUE ~ "Missing Data" ), line_color = case_when( storm_status == "TD" ~ "#2AFF00", storm_status == "TS" ~ "#FFD020", hurricane_category == 1 ~ "#FF4343", hurricane_category == 2 ~ "#FF6FFF", hurricane_category == 3 ~ "#FF23D3", hurricane_category == 4 ~ "#C916FF", hurricane_category == 5 ~ "#FFFFFF", storm_status == "EX" ~ "#202020", storm_status == "SD" ~ "#0055FF", storm_status == "SS" ~ "#6CE2FF", storm_status %in% c("LO", "WV", "DB") ~ "#A1A1A1", TRUE ~ "#FF5C00" ) ) %>% arrange(datetime) # Create ordered factor for legend storm_track$status_label <- factor( storm_track$status_label, levels = c( "Tropical Depression (TD)", "Tropical Storm (TS)", "Hurricane Category 1", "Hurricane Category 2", "Hurricane Category 3", "Hurricane Category 4", "Hurricane Category 5", "Extratropical Cyclone (EX)", "Subtropical Depression (SD)", "Subtropical Storm (SS)", "Low/Wave/Disturbance", "Missing Data" ) ) world <- ne_countries(scale = "medium", returnclass = "sf") states <- ne_states(returnclass = "sf") min_lon_range <- range(-100, -40) min_lat_range <- range(10, 50) #lon_range <- range(storm_track$lon) #lat_range <- range(storm_track$lat) #lon_padding <- diff(lon_range) * 0.1 #lat_padding <- diff(lat_range) * 0.1 p <- ggplot() + geom_sf(data = world, fill = "#E5E5E5", color = "#999999", size = 0.3) + geom_sf(data = states, fill = NA, color = "#CCCCCC", size = 0.2) + #coord_sf( #xlim = c(lon_range[1] - lon_padding, lon_range[2] + lon_padding), #ylim = c(lat_range[1] - lat_padding, lat_range[2] + lat_padding), #expand = FALSE #) + coord_sf( xlim = c(min_lon_range[1], min_lon_range[2]), ylim = c(min_lat_range[1], min_lat_range[2]), expand = FALSE ) + theme_minimal() + theme( panel.background = element_rect(fill = "#D4E6F1"), panel.grid.major = element_line(color = "#BBBBBB", size = 0.2), legend.position = "right", legend.key.size = unit(0.4, "cm"), legend.text = element_text(size = 8) ) if (nrow(storm_track) >= 2) { for (i in 1:(nrow(storm_track) - 1)) { segment_data <- storm_track[i:(i + 1), ] p <- p + geom_path( data = segment_data, aes(x = lon, y = lat), color = storm_track$line_color[i], size = 1 ) } } p <- p + geom_point( data = storm_track, aes(x = lon, y = lat, color = status_label), size = 1.5 ) landfall_data <- storm_track %>% filter(record_identifier == "L") if (nrow(landfall_data) > 0) { landfall_data <- landfall_data %>% mutate(rmw_degrees = rmw_meters / 111320) p <- p + geom_point( data = landfall_data, aes(x = lon, y = lat), color = landfall_data$line_color, size = 4, shape = 19 ) + geom_point( data = landfall_data, aes(x = lon, y = lat), color = landfall_data$line_color, size = landfall_data$rmw_degrees * 100, shape = 1, stroke = 1.5, alpha = 0.5 ) } color_values <- c( "Tropical Depression (TD)" = "#2AFF00", "Tropical Storm (TS)" = "#FFD020", "Hurricane Category 1" = "#FF4343", "Hurricane Category 2" = "#FF6FFF", "Hurricane Category 3" = "#FF23D3", "Hurricane Category 4" = "#C916FF", "Hurricane Category 5" = "#FFFFFF", "Extratropical Cyclone (EX)" = "#202020", "Subtropical Depression (SD)" = "#0055FF", "Subtropical Storm (SS)" = "#6CE2FF", "Low/Wave/Disturbance" = "#A1A1A1", "Missing Data" = "#FF5C00" ) p <- p + scale_color_manual( name = "Storm Status", values = color_values, breaks = names(color_values), drop = FALSE ) + labs( title = paste(params$storm_name, params$storm_year), x = "Longitude", y = "Latitude" ) print(p) ```