library(tidyverse)
library(ggthemes)
library(rvest)
library(plotly)
library(shiny)
library(shinythemes)
library(bslib)

load/combine data

combined_disaster_data <- read_csv("combined_disaster_data.csv")
disaster_summary <- combined_disaster_data %>%
  group_by(Year, Disaster) %>%
  summarize(Count = n(), .groups = "drop") %>%
  complete(Year, Disaster, fill = list(Count = 0))
total_summary <- combined_disaster_data %>%
  group_by(Year) %>%
  summarize(Count = n()) %>%
  mutate(Disaster = "All Disasters") 

plot_data <- bind_rows(disaster_summary, total_summary)

disaster_colors <- c(
  "All Disasters" = "black",
  "Flooding" = "dodgerblue",
  "Hurricane" = "orange",
  "Tropical Cyclone" = "seagreen",
  "Drought" = "darkgoldenrod2",
  "Wildfire" = "green4",
  "Winter Storm" = "lightskyblue3",
  "Freeze" = "powderblue"
)

define ui

ui <- fluidPage(
  theme = bs_theme(bootswatch = "cerulean"),
  titlePanel("Trends in U.S. Billion-Dollar Disasters (1980–2024)"),
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput(
        inputId = "disaster_types",
        label = "Select Disaster Types:",
        choices = unique(plot_data$Disaster),
        selected = unique(plot_data$Disaster)
      )
    ),
    mainPanel(
      plotlyOutput("disaster_plot")
    )
  )
)

define server

server <- function(input, output) {
  output$disaster_plot <- renderPlotly({
    filtered_data <- plot_data %>%
      filter(Disaster %in% input$disaster_types)
    billion_disasters <- ggplot(filtered_data, aes(x = Year, y = Count)) +
      geom_line(aes(color = Disaster), linewidth = 1) +
      scale_color_manual(values = disaster_colors) +
      scale_x_continuous(breaks = seq(1980, 2024, by = 5)) +
      labs(
        x = "Year",
        y = "Number of Events"
      ) +
      theme_minimal(base_size = 12) +
      theme(
        plot.title = element_text(face = "bold", size = 24),
        panel.grid = element_blank(),
        legend.position = "none",
      )
    
    ggplotly(billion_disasters) %>%
      layout(yaxis = list(autorange = TRUE),
             legend = list(title = list(text = "Disaster Type")))
  })
}

run app

shinyApp(ui = ui, server = server)