add table coloring and cost charts

This commit is contained in:
2025-12-18 21:34:52 -05:00
parent deb91a7359
commit b8f07643c8
+171 -11
View File
@@ -1,9 +1,15 @@
--- ---
title: "`r params$storm_name` `r params$storm_year` STORM REPORT" title: "`r params$hurdat_id` `r params$storm_name` `r params$storm_year` STORM REPORT"
subtitle: "Generated on: `r Sys.Date()`" subtitle: "Generated on: `r Sys.Date()`"
format: format:
pdf: pdf:
theme: cosmo theme: cosmo
geometry:
- top=0.75in
- bottom=0.75in
- left=0.75in
- right=0.75in
- footskip=0.3in
execute: execute:
warning: false warning: false
message: false message: false
@@ -11,15 +17,18 @@ params:
storm_basin: AL storm_basin: AL
storm_year: 1900 storm_year: 1900
storm_name: GALVESTON storm_name: GALVESTON
hurdat_id: AL011900
--- ---
```{r setup} ```{r setup, echo=FALSE}
#| echo: false
library(ggplot2) library(ggplot2)
library(sf) library(sf)
library(rnaturalearth) library(rnaturalearth)
library(dplyr) library(dplyr)
library(scales)
library(knitr)
library(kableExtra)
library(patchwork)
source(file = "queries.R") source(file = "queries.R")
@@ -30,16 +39,56 @@ storm <- list(
) )
unique_lfs <- get_unique_lf_ids(storm) unique_lfs <- get_unique_lf_ids(storm)
hurdat_id <- get_hurdat_id(storm)
storm_track <- get_hurdat_track(storm) plot_theme <- theme(
plot.title = element_text(hjust = 0.5, size = 10),
axis.title = element_text(size = 10),
axis.text = element_text(size = 8),
legend.title = element_text(face = "bold"),
legend.text = element_text(face = "bold")
)
``` ```
```{r track_map} ```{r storm_overview, echo=FALSE}
#| echo: false # storm stats
# mmh, mmp, landfalls, hurdat summary (max cat, min press, max wind, hurricane points, total points)
# fatality data?
hurdat_summary <- get_best_track_summary(storm)
losses <- get_latest_aggregate_loss(storm)
storm_track <- get_hurdat_track(storm)
```
# Storm Overview
- **HURDAT2 ID** `r hurdat_id$hurdatid`
- **HURDAT2 Revision Date** `r hurdat_id$hurdat_rev`
## Normalized Cost
- **MMH24** `r dollar(losses$mmh)`
- **MMP24** `r dollar(losses$mmp)`
## HURDAT2 Summary
- **Date Range** `r min(storm_track$formatted_datetime)` to `r max(storm_track$formatted_datetime)`
- **Total Observations** `r hurdat_summary$total_observations`
- **Hurricane Observations** `r hurdat_summary$hurricane_observations`
- **Landfall Observations** `r hurdat_summary$hurdat_landfalls`
- **Maximum Saffir-Simpson Category** `r hurdat_summary$max_category`
- **Minimum Pressure** `r hurdat_summary$min_pressure` mb
- **Maximum Windspeed** `r hurdat_summary$max_windspeed` kts
## Storm Track
```{r track_map, echo=FALSE}
#| fig-width: 10 #| fig-width: 10
#| fig-height: 8 #| fig-height: 8
#| out-width: "100%"
# Add color and category classification
storm_track <- storm_track %>% storm_track <- storm_track %>%
mutate( mutate(
hurricane_category = case_when( hurricane_category = case_when(
@@ -80,7 +129,6 @@ storm_track <- get_hurdat_track(storm)
) %>% ) %>%
arrange(datetime) arrange(datetime)
# Create ordered factor for legend
storm_track$status_label <- factor( storm_track$status_label <- factor(
storm_track$status_label, storm_track$status_label,
levels = c( levels = c(
@@ -130,7 +178,8 @@ storm_track <- get_hurdat_track(storm)
legend.position = "right", legend.position = "right",
legend.key.size = unit(0.4, "cm"), legend.key.size = unit(0.4, "cm"),
legend.text = element_text(size = 8) legend.text = element_text(size = 8)
) ) +
plot_theme
if (nrow(storm_track) >= 2) { if (nrow(storm_track) >= 2) {
for (i in 1:(nrow(storm_track) - 1)) { for (i in 1:(nrow(storm_track) - 1)) {
@@ -208,3 +257,114 @@ storm_track <- get_hurdat_track(storm)
print(p) print(p)
``` ```
## Track Observations
```{r track_table, echo=FALSE}
landfall_rows <- which(storm_track$record_identifier == "L")
storm_track %>%
select(
formatted_datetime,
storm_status,
record_identifier,
lon,
lat,
rmw,
pressure,
windspeed
) %>%
kable(
col.names = c(
"Date",
"Status",
"Record ID",
"Lon",
"Lat",
"RMW",
"Pressure",
"Windspeed"
),
align = c("l", "c", "c", "r", "r", "r", "r", "r"),
booktabs = TRUE
) %>%
kable_styling(
#latex_options = c("striped"),
font_size = 9,
position = "center"
) %>%
column_spec(
2,
color = "white",
background = paste0(storm_track$line_color, "A0"),
bold = T
) %>%
row_spec(
landfall_rows,
color = "white",
background = paste0(storm_track$line_color[landfall_rows], "A0")
) %>%
column_spec(
6,
color = "white",
background = spec_color(storm_track$rmw, end = 0.7),
bold = T
) %>%
column_spec(
7,
color = "white",
background = spec_color(storm_track$pressure, end = 0.7),
bold = T
) %>%
column_spec(
8,
color = "white",
background = spec_color(storm_track$windspeed, end = 0.7),
bold = T
)
```
## Cost Normalization
```{r normalization, echo=FALSE}
#| out-width: "100%"
costs <- get_all_normalized_cost_index(storm)
# for each lf, create charts of mmh/mmp
unique_lf_ids <- unique_lfs$full_lf_id
for(lf in unique_lf_ids) {
filtered_costs <- costs %>%
filter(
full_lf_id == lf
)
mmh_plot <- ggplot(filtered_costs, aes(x = normalization_year, y = mmh_loss)) +
geom_area(fill = "blue", alpha = 0.7) +
scale_y_continuous(labels = scales::label_dollar(scale_cut = cut_short_scale())) +
labs(
title = paste(lf, "MMH Loss"),
x = "Year",
y = "Aggregate Loss (USD)"
) +
theme_minimal() +
plot_theme
mmp_plot <- ggplot(filtered_costs, aes(x = normalization_year, y = mmp_loss)) +
geom_area(fill = "red", alpha = 0.7) +
scale_y_continuous(labels = scales::label_dollar(scale_cut = cut_short_scale())) +
labs(
title = paste(lf, "MMP Loss"),
x = "Year",
y = "Aggregate Loss (USD)"
) +
theme_minimal() +
plot_theme
print(mmh_plot)
print(mmp_plot)
}
```