DATA 608: Story - 5 : What Is The Effect Of The Earth’s Temperature on Cyclonic Storms?

Bikash Bhowmik —- Date: 09-Nov-2025

Column

Column

Instruction

What Is The Effect Of The Earth’s Temperature on Cyclonic Storms? Historic data indicates that the occurrence and intensity of cyclonic storms (Hurricanes, Typhoons and Tornados) increases with the increased earth temperature. For this assignment you will need to tell this story to a non-technical audience (eg: a high-school earth science class).

Notes:

  • Source historic data for a period of at least 25 years on a measure of the earth’s temperature.

  • Source data on the occurrence and intensity of hurricanes, typhoons and tornados for the same historic period.

  • Perform the data analysis to establish the correlations between earth temperature and storm occurrence and intensity.

  • Tell the story of this data and your analysis using data visualizations and other illustrations (eg: pictures of storm damage) in a presentation that will be accessible to a high-school earth science class.


Introduction

Our planet’s climate is changing and one of the most noticeable signs is the steady increase in Earth’s temperature over the past century. Scientists call this global warming, and it refers to the long-term rise in the average temperature of the Earth’s surface due to human activities, such as burning fossil fuels and deforestation. This warming trend affects not only air and land temperatures but also the world’s oceans — and warm oceans are a key ingredient for cyclonic storms.

Cyclonic storms such as hurricanes, typhoons, and tornadoes draw their strength from warm ocean water. When the sea surface temperature rises, more heat and moisture enter the atmosphere, providing extra energy to fuel these storms. As a result, storms can become stronger, last longer, and cause more damage when they make landfall.

In this project, we explore the connection between the Earth’s rising temperature and the frequency and intensity of cyclonic storms. Using more than 25 years of historical data, we examine trends in global surface temperature alongside storm activity records. By combining visual data analysis with simple explanations, we aim to tell the story of how a warming planet influences the world’s most powerful natural phenomena in a way that is both scientifically accurate and easy to understand.

Import libraries
Load Earth Surface Temperature Data

library(rvest)
library(dplyr)
library(kableExtra) 
library(tidyverse)
library(plotly)
library(readr)
library(ggplot2)

Chart 1: Global Temperature Trend

Over the past century, Earth’s surface has been steadily warming — a trend known as global warming. Scientists track this by looking at temperature anomalies, which measure how each year’s temperature differs from a long-term average.

The chart below uses annual temperature anomalies to show how the planet’s surface temperature has changed from 1880 to 2023. The red line represents the yearly values, while the blue dashed line shows the overall warming trend.

This visualization helps us understand the backdrop for the rest of our story: warmer oceans and atmosphere create the conditions for stronger and more frequent cyclones.

# Load temperature data
df <- read.csv("GLB_Ts_dSST.csv", skip = 1, header = TRUE, check.names = TRUE, na.strings = "***")
df <- df[complete.cases(df), ]

ggplot(df, aes(x = Year, y = `J.D`)) +
  geom_line(color = "red", size = 1) +
  geom_point(color = "darkred", size = 1) +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE,
              color = "darkblue", linetype = "dashed", size = 1.5) +
  annotate("text", x = 1960, y = 0.8, 
           label = "Rising Temperatures Fuel Cyclones", 
           color = "blue", size = 5, fontface = "bold") +
  geom_rect(aes(xmin = 2010, xmax = 2023, ymin = -Inf, ymax = Inf),
            fill = "pink", alpha = 0.05) +  # lighter highlight
  scale_x_continuous(breaks = seq(1880, 2025, 20)) +
  labs(
    title = "Rising Global Temperatures: Setting the Stage for Stronger Cyclones",
    subtitle = "Red line: Annual mean temperature anomaly | Blue dashed: Linear trend",
    x = "Year", y = "Temperature Anomaly (°C)"
  ) +
  theme_light(base_size = 14) +
  theme(
    plot.title = element_text(size = 20, face = "bold"),
    plot.subtitle = element_text(size = 16)
  )

This graph illustrates the rise in global surface temperature from the long-term average spanning 1881 to 2023. The Earth has experienced its highest average surface temperatures on record since 2005 (source: NASA GISS). NASA’s findings align closely with independent analyses from the National Oceanic and Atmospheric Administration (NOAA) and other research organizations. Overall, Earth’s temperature in 2023 was approximately 2.45 °F (about 1.36 °C) above the late 19th-century (1850–1900) pre-industrial average. Notably, the past ten years have been the warmest on record.

Explore Cyclonic Storms Data

Data Source: ACE (Accumulated Cyclone Energy) Information - Yearly (obtained from Wikipedia - https://en.wikipedia.org/wiki/Accumulated_cyclone_energy)

ACE Data - Yearly: Scraping from Wikipedia

To perform web scraping from Wikipedia, the rvest package was used. The first step entails reading the Wikipedia page and storing it in an object named wbpg using the read_html() function. Subsequently, any table information is extracted into the tbl object. Then, I’ll specifically parse the table related to the Accumulated Cyclone Energy - Atlantic using the grep function and store it in a data.frame.

# --- Step 1: Read Wikipedia page ---
url <- "https://en.wikipedia.org/wiki/Accumulated_cyclone_energy"
wbpg <- read_html(url)
tbls <- html_nodes(wbpg, "table")
tbl_list <- lapply(tbls, html_table, fill = TRUE)

# --- Step 2: Select the correct table (Table 5) ---
storms_df <- tbl_list[[5]]

# --- Step 3: Clean column names ---
storms_df <- storms_df %>%
  rename(
    Year = Season,
    ACE = ACE,
    TS = TS,
    HU = HU,
    MH = MH
  ) %>%
  mutate(across(c(Year, ACE, TS, HU, MH), as.numeric)) %>%
  filter(!is.na(Year))

# --- Step 4: Add derived variable (Minor Tropical Storms) ---
storms_df <- storms_df %>%
  mutate(MTS = TS - HU - MH)

# --- Step 5: Keep  years of data ---
storms_df <- storms_df %>%
  arrange(desc(Year)) %>%
  slice_head(n = 135) %>%
  arrange(Year)

# --- Step 6: Show first 5 records ---
storms_df %>%
  slice(1:5) %>%
  kbl(caption = "Cyclonic Storms Intensity") %>%
  kable_paper("hover", full_width = F, position = "center") %>%
  row_spec(0, color = "black", background = "white")
Cyclonic Storms Intensity
Year ACE TS HU MH Classification MTS
1891 116.1050 10 7 1 Near normal 2
1892 115.8375 9 5 0 Near normal 4
1893 231.1475 12 10 5 Extremely active -3
1894 135.4200 7 5 4 Above normal -2
1895 68.7650 6 2 0 Below normal 4


There are 144 observations and six variables such as Year, ACE (Accumulated Cyclone Energy), TS (Tropical Cyclone), HU (Hurricane), MH (Major Hurricane) and MTS (Minor Tropical Storm) in stroms_df data frame.

Chart 2: Cyclone Frequency Over Time

Cyclones vary in size and strength, from tropical storms to massive hurricanes. To understand trends in storm occurrence, we look at how many storms of each type occur each year.

The chart below plots the number of tropical storms (TS), hurricanes (HU), and major hurricanes (MH) . By visualizing these storm frequencies together, we can see whether there are patterns in storm activity and identify years with unusually high or low counts.

This sets the stage for connecting storm frequency to rising global temperatures in the next charts.

ggplot(storms_df, aes(x = Year)) +
  # Shaded background for peak years
  annotate("rect", xmin = 1994.5, xmax = 1995.5, ymin = -Inf, ymax = Inf, fill = "pink", alpha = 0.1) +
  annotate("rect", xmin = 2004.5, xmax = 2005.5, ymin = -Inf, ymax = Inf, fill = "pink", alpha = 0.1) +
  annotate("rect", xmin = 2019.5, xmax = 2020.5, ymin = -Inf, ymax = Inf, fill = "pink", alpha = 0.1) +

  # Storm frequency lines
  geom_line(aes(y = TS, color = "Tropical Storms"), size = 1.2, alpha = 0.6) +
  geom_line(aes(y = HU, color = "Hurricanes"), size = 1.3, alpha = 0.8) +
  geom_line(aes(y = MH, color = "Major Hurricanes"), size = 1.8, alpha = 1) +

  # Highlight peak years
  geom_vline(xintercept = c(1995, 2005, 2020), linetype = "dashed", color = "red", alpha = 0.5) +
  geom_text(aes(x = 1995, y = 25, label = "1995 Peak"), color = "red", angle = 90, vjust = -0.5, size = 4) +
  geom_text(aes(x = 2005, y = 25, label = "2005 Peak"), color = "red", angle = 90, vjust = -0.5, size = 4) +
  geom_text(aes(x = 2020, y = 25, label = "2020 Peak"), color = "red", angle = 90, vjust = -0.5, size = 4) +

  # Custom colors and labels
  scale_color_manual(values = c(
    "Tropical Storms" = "#1f77b4",  # brighter blue
    "Hurricanes" = "#ff7f0e",       # bright orange
    "Major Hurricanes" = "#d62728"  # strong red
  )) +

  # Titles and theme
  labs(
    title = "Storm Activity Has Increased Over Time — Especially in Key Peak Years",
    subtitle = "Red dashed lines mark years (1995, 2005, 2020) with unusually high storm counts",
    x = "Year",
    y = "Number of Storms",
    color = "Storm Type"
  ) +
  theme_light(base_size = 15) +
  theme(
    plot.title = element_text(size = 20, face = "bold"),
    plot.subtitle = element_text(size = 15),
    legend.position = "top"
  )

The pattern here is striking — the number of storms has generally increased over the past few decades.
Years like 1995, 2005, and 2020 stand out as clear spikes, often following periods of unusually high global temperatures.
This growing storm activity hints that our warming planet may be fueling more frequent cyclonic disturbances.

Chart 3: Cyclone Intensity Over Time

Not all storms are equal — some may last a few hours, while others persist for days and pack tremendous energy. Scientists combine strength and duration into a single measure called Accumulated Cyclone Energy (ACE).

The chart below shows how cyclone intensity has changed over time, with a smoothed red line to highlight long-term trends. Higher ACE values indicate years when cyclones were more energetic.

This visualization allows us to explore whether warmer years tend to produce stronger storms, providing a link between climate trends and extreme weather events.


# ---- Font Descriptions ----
t1 <- list(family = "Arial, sans-serif", size = 13, color = "black")
t2 <- list(family = "Arial, sans-serif", size = 12, color = "black")

# Remove missing values
storms_df <- storms_df[complete.cases(storms_df), ]

# Smooth ACE curve
ACE_smooth <- loess(ACE ~ Year, data = storms_df, span = 0.05)
ACE_pred <- predict(ACE_smooth)

# Merge with temperature data
combined_df <- merge(storms_df, df[, c("Year", "J.D")], by = "Year", all.x = TRUE)

# Normalize temperature for color mapping (optional but helps visually)
combined_df$J.D_scaled <- scales::rescale(combined_df$J.D, to = c(0, 1))

plot_ly(combined_df, x = ~Year) %>%
  # Raw ACE points colored by temperature
  add_trace(
    y = ~ACE, 
    type = 'scatter', 
    mode = 'markers', 
    name = 'ACE by Temperature',
    marker = list(
      color = ~J.D, 
      colorscale = 'RdYlBu', 
      reversescale = TRUE,
      size = 10,
      showscale = TRUE,
      colorbar = list(title = "Temperature (°C)", tickfont = t2)
    ),
    hovertemplate = paste(
      "Year: %{x}<br>",
      "ACE: %{y:.1f}<br>",
      "Temp (J.D): %{marker.color:.2f}°C"
    )
  ) %>%
  # Smoothed ACE trend line
  add_trace(
    y = ~ACE_pred, 
    type = 'scatter', 
    mode = 'lines', 
    name = 'Smoothed Trend',
    line = list(color = 'red', width = 4)
  ) %>%
  # Highlight peak years
  add_trace(
    data = combined_df[combined_df$Year %in% c(1995, 2005, 2017), ],
    x = ~Year, y = ~ACE,
    type = 'scatter', mode = 'markers+text',
    marker = list(color = 'orange', size = 14, symbol = 'star'),
    text = ~paste('Peak:', Year),
    textposition = 'top center',
    name = 'Peak Years'
  ) %>%
  layout(
    title = list(
      text = "Cyclone Energy (ACE) Rises During Warmer Years",
      font = list(size = 20, family = "Arial, sans-serif"),
      y = 0.95 
    ),
    xaxis = list(title = "Year", dtick = 5, titlefont = t1),
    yaxis = list(title = "ACE (10⁴ kn²)", titlefont = t1),
    legend = list(orientation = 'h', x = 0.2, y = -0.3),
    margin = list(b = 100)
  )

While storm counts tell part of the story, the energy behind those storms reveals even more.
We can see that ACE values rise sharply during the same warm years, confirming that not only are storms becoming more common — they are also becoming more powerful.
This strengthens the link between rising ocean temperatures and the intensification of cyclones.

Chart 4: Temperature vs Storms

This chart brings together temperature and storm data to show the relationship between global warming, storm frequency, and storm intensity.
- The x-axis represents the number of tropical storms in a year.

  • The y-axis represents storm energy (ACE).

  • Each point is a year, and the color shows the average global temperature: blue for cooler years, red for warmer years.

From this visualization, we can see a clear pattern: warmer years tend to have more storms that are also stronger. This chart tells the story of how rising global temperatures can influence the power and frequency of cyclones — a central message in our analysis of climate impacts.


# select Year and J.D temperature data from df
selected_df <- df[, c("Year", "J.D")]

# Merge the two data frames by the Year column
combined_df <- merge(storms_df, selected_df, by = "Year", all = TRUE)
combined_df$ACE <- as.numeric(combined_df$ACE)


# Create the scatter plot
scatter_plot <- plot_ly(data = combined_df, x = ~TS, y = ~ACE, z = ~J.D, color = ~Year,
                        colors = c("#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#ffff33", "#a65628", "#f781bf", "#999999"),
                        marker = list(size = 10),
                        type = "scatter3d", mode = "markers", text = ~paste("Year: ", Year),
                        hoverinfo = "text") %>%
  layout(
    title = "Relationship between Storms Frequency, Intensity , and Earth Temperature",
    scene = list(
      xaxis = list(title = "Storms Occurence"),
      yaxis = list(title = " Cyclone Intensity"),
      zaxis = list(title = "Temperature")
    )
  )

# Display the plot
scatter_plot

When the Earth’s surface temperature rises above about 26°C, the occurrence and intensity of tropical cyclones tend to increase. While individual cyclones cannot be directly attributed to global warming, warmer oceans provide more heat and moisture — the key ingredients that fuel stronger storms. As global temperatures continue to rise, scientists expect that the frequency of intense tropical cyclones will also increase, making these storms more powerful and potentially more destructive.

Conclusion

Imagine the Earth as a giant engine when it gets warmer, it powers up storms across the oceans. Our data shows that in years when global temperatures rise, tropical storms, hurricanes, and major hurricanes tend to become more frequent and stronger. The red line in our smoothed ACE plot shows just how storm energy spikes in warmer years.

While a single hurricane or typhoon isn’t caused by global warming alone, the overall trend is clear: a warmer planet fuels more intense and energetic cyclones. This means that as Earth continues to heat up, future storms could pack even more punch, posing bigger risks to coastal communities and ecosystems.

By looking at the colorful scatter plot, we can see the story: more storms, higher intensity, and hotter years—nature’s way of showing us that climate change has real, visible effects on extreme weather. Understanding these patterns helps us prepare, adapt, and take action to protect people and places from the growing power of cyclones.