Happy New Year from the Aquatic Sciences Lab!

The lab celebrates our second anniversary this month and we are looking both backwards at a busy 2025 and forwards to an exciting 2026. Lab members will be at many conferences in the coming year to present on current and future research, with new projects in prep!

As part of our annual reflection, we like to look back in the year in rainfall. Here is a link to our 2024 Rainfall Wrapped post.

Rainfall Wrapped!

As a refresher: The Jones Center collects rainfall in a few locations across the ~30,000 acre property and in collaboration with various partners.

Rainfall is collected by the Ecohydrology lab at climate stations and wetlands across the property. They use wetland rainfall collectors to precisely determine water budgets, which is a challenge for our many tiny (<5 ha) wetlands.

Our collaborators at NEON collect rainfall at their installation.

The Georgia Automated Environmental Monitoring Network (GAEMN) collects rainfall at a climate station on site for Baker County, Georgia. Finally, we partner with NOAA to maintain a climate station. So, when we need to pick rainfall, there are many options to choose from!

For this exercise, we will use data from the GAEMN station. These data are collected every 15 minutes, so for an entire years’ worth of data, there are 35138 observations! We can make that an easier chunk by summing together rainfall for each day and creating a time-series for each day. Graphs showing rainfall are shown with rainfall ‘falling’ from the top of the graph towards the bottom; the formal name for a graph like this is a ‘hyetograph’.

First, we will load the data into R and convert sub-daily rainfall from 15-min to daily for all dates in 2024 and 2025.

# load packages
library(tidyverse)

d <- readr::read_csv('R:/aquatic_sciences/climate/ich-climate/data/3_climate_compiled_2024-01-01_2026-01-01.csv')

daily <- d %>% 
  group_by(date = lubridate::date(date)) %>% 
  summarise(rain_mm = sum(rainfall_mm, na.rm = TRUE)) %>% 
  filter(lubridate::year(date) == '2025')

Daily Rainfall

Let’s take a look at a graph of daily rainfall

fig_1 <- ggplot(data = daily, 
                  aes(x = date, 
                      y = rain_mm))+
  geom_bar(stat = 'identity',
           fill = 'blue')+
  lims(y = c(125, 0))+
  labs(y = 'Rainfall (mm/day)',
       x = element_blank())+
  theme_classic()
fig_1

ggsave(plot = fig_1,
       filename = paste0(save_dir,'fig_1.png'), 
       dpi = 600, 
       height = 2, 
       width = 5)

Next, we can calculate some values of interest for the year.

The total annual rainfall for 2024 was 1012.204

The wettest day of the year was 2025-04-07

The number of days with 0 rainfall was 267. That means there was 70% sunny days at Ichauway!

We can determine the length of days with no rain and the length of days with continuous rain using the following code

rle <- rle(daily$rain_mm)

rle_df <- data.frame(values = rle$values, 
                     lengths = rle$lengths)

rle_df %>% 
  filter(values == 0) %>% 
  slice_max(lengths) %>% 
  pull(lengths)
## [1] 25
x <- daily %>% 
  mutate(rained = ifelse(rain_mm > 0,
                         1,
                         0))
y <- rle(x$rained == 1)

data.frame(length = y$lengths,
           values = y$values) %>% 
  filter(values == TRUE) %>% 
  slice_max(length) %>% 
  pull(length)
## [1] 9

Monthly Rainfall

To explore seasonality in rainfall, we can look at monthly rainfall

month <- daily %>% 
  group_by(month = lubridate::month(date,abbr = TRUE, label = TRUE)) %>% 
  summarise(rain_mm = sum(rain_mm, na.rm = TRUE)) %>% 
  filter(!is.na(month))
month
## # A tibble: 12 × 2
##    month rain_mm
##    <ord>   <dbl>
##  1 Jan    65.8  
##  2 Feb   102.   
##  3 Mar   153.   
##  4 Apr   143.   
##  5 May   135.   
##  6 Jun   137.   
##  7 Jul    44.7  
##  8 Aug    82.8  
##  9 Sep     0.254
## 10 Oct    18.5  
## 11 Nov    20.3  
## 12 Dec   110.
fig_2 <- ggplot(data = month,
                aes(x = month))+
  geom_bar(aes(y = rain_mm),
           stat = 'identity',
           fill = 'blue')+
  lims(y = c(175, 0))+
  labs(x = element_blank(),
       y = 'Rainfall (mm/month)')
fig_2

ggsave(plot = fig_2,
       filename = paste0(save_dir,'fig_2.png'), 
       dpi = 600, 
       height = 2, 
       width = 5)

The wettest month was March (153 mm), followed closely by April (143 mm). The driest month was September (0.25 mm). The data show a wetter period in the brief winter, spring, and early summer that yields to a drier summer and fall period.

Flash Drought

Annual Rainfall

So, how does the rainfall during 2025 compare to other years? The GAEMN record has continuous records back to 2001 and we can compare rainfall during 2024 to each year in the past. We will have to do some data formatting to have the long-term data work with the 2024 data, and then we can combine into one single dataset.

# read in the long-term data
old <- readr::read_csv('R:/aquatic_sciences/climate/ich-climate/data/4_old-rain.csv')

# make it easier to handle
short <- old %>% 
  dplyr::select(date, rain_tot_cm) %>% 
  dplyr::mutate(rain_mm = rain_tot_cm * 10) %>% 
  dplyr::select(-rain_tot_cm)


all <- d %>% 
  group_by(date = lubridate::date(date)) %>% 
  summarise(rain_mm = sum(rainfall_mm, na.rm = TRUE)) %>% 
  bind_rows(short) %>% 
  arrange(date)

# and annual cumulative rainfall
ann_cum_rain <- all %>% 
  dplyr::mutate(year = lubridate::year(date),
                jday = lubridate::yday(date)) %>% 
  group_by(year) %>% 
  mutate(cum_rain_mm = cumsum(rain_mm),
         label = ifelse(jday == 365,
                        year,
                        NA))

In 2025, Ichauway received 1.38 m of rainfall. Since 2001, the mean ± standard deviation of annual rainfall has been 1.24 ± 0.3 m of rainfall. This suggests that 2024 had slightly more rain than usual, but by no means an abnormal amount more.

ann_tots <- ann_cum_rain %>% 
  group_by(year) %>% 
  slice_tail()

fig_3 <- ann_tots %>% 
  ggplot(.,
         aes(x = year, 
             y = cum_rain_mm,
             fill = cum_rain_mm))+
  geom_bar(stat = 'identity')+
  geom_hline(yintercept = mean(ann_tots$cum_rain_mm, na.rm = TRUE),
             linetype = 'dashed')+
  lims(y = c(1750, 0))+
  labs(x = 'Year',
       y = element_blank())+
  scale_fill_continuous(name = 'Annual Rainfall (m)')
fig_3

ggsave(plot = fig_3,
       filename = paste0(save_dir,'fig_3.png'), 
       dpi = 600, 
       height = 2, 
       width = 5)

Another way to examine the normality of when rainfall occurs is through cumulative rainfall plots. In this analysis, we take the rainfall amounts from each day in a given year and cumulatively add one day’s rainfall to the following day. The final values end up making Figure 4 (above), but we can follow the path of one year’s rainfall to identify large jumps in rain (like a hurricane) or periods of flat rainfall (dry periods or droughts).

fig_4 <- ggplot(ann_cum_rain,
                aes(x = jday,
                    y = cum_rain_mm,
                    color = factor(year),
                    group = factor(year)))+
  geom_line()+
  gghighlight::gghighlight(year == 2025)+
  xlim(0, 365)+
  labs(x = 'Day of Year',
       y = 'Cumulative Annual Rainfall (mm)')+
  scale_color_viridis_d(name = 'Year')
fig_4

ggsave(plot = fig_4,
       filename = paste0(save_dir,'fig_4.png'), 
       dpi = 600, 
       height = 3, 
       width = 5)

mean_cum_rain <- ann_cum_rain %>% 
  group_by(jday) %>% 
  summarise(mean_cum_rain = mean(cum_rain_mm),
            sd_cum_rain = sd(cum_rain_mm))


fig_5 <- ggplot()+
  geom_ribbon(data = mean_cum_rain %>% 
                filter(jday < 366),
              aes(x = jday,
                  ymin = mean_cum_rain - sd_cum_rain,
                  ymax = mean_cum_rain + sd_cum_rain),
              fill = 'pink',
              alpha = 0.5)+
  geom_line(data = mean_cum_rain %>% 
              filter(jday < 366),
            aes(x = jday,
                y = mean_cum_rain),
            color = 'red')+
  geom_line(data = ann_cum_rain %>% 
              filter(is.na(label)),
            color = 'black',
            aes(x = jday,
                y = cum_rain_mm,
                # color = factor(year),
                group = factor(year)))+
  gghighlight::gghighlight(year == 2025,
                           label_key = year)+
  labs(x = 'Day of Year',
       y = 'Cumulative Annual Rainfall (m)')+
  scale_color_viridis_d(name = 'Year')
fig_5

ggsave(plot = fig_5,
       filename = paste0(save_dir,'fig_5.png'), 
       dpi = 600, 
       height = 3, 
       width = 5)

2025 experienced a bit of everything. The late winter and spring were ‘average’, as the cumulative rainfall was very near the cumulative average, even exceeding average in the early summer. However, the flash drought in September and October show up and an ‘average’ year becomes a well below average year.

Deviation from ‘Normal’?

Finally, with the full dataset, we can calculate the average monthly rainfall to identify seasonal patterns with more data. In the graph, the mean monthly rainfall is shown in the blue line, and the 2024 monthly rainfall are the bars. This visualization allows us to clearly see the deviation from ‘normal’ conditions in 2024, particularly in July and September (wetter) and October (drier).

mean_mon_tots <- ann_cum_rain %>% 
  group_by(month = lubridate::month(date, label = TRUE, abbr = TRUE),
           year = lubridate::year(date)) %>% 
  summarise(mean_yrmon_rain = sum(rain_mm, na.rm = TRUE)) %>% 
  group_by(month) %>% 
  summarise(mean_mon_rain = mean(mean_yrmon_rain, na.rm = TRUE),
            sd_mon_rain = sd(mean_yrmon_rain, na.rm = TRUE)) %>% 
  filter(!is.na(month))

fig_6 <- ggplot(data = cbind(month,
                             mean_mon_tots)[,c(1,2,4,5)],
                aes(x = month))+
  geom_bar(aes(y = rain_mm),
           stat = 'identity')+
  geom_errorbar(aes(ymin = mean_mon_rain - sd_mon_rain,
                  ymax = mean_mon_rain + sd_mon_rain),
              color = 'blue',
              width = 0,
              linewidth = 1.5)+
  geom_point(size = 4,
             aes(y = mean_mon_rain,
                 color = 'Mean Monthly Rainfall'))+
  geom_line(aes(y = mean_mon_rain,
                group = 1,
                color = 'Mean Monthly Rainfall'),
            linewidth = 1.5)+
  scale_color_manual(name = element_blank(),
                     values = 'blue')+
  lims(y = c(250, 0))+
  labs(x = element_blank(),
       y = 'Rainfall (mm/month)')
fig_6

ggsave(plot = fig_6,
       filename = paste0(save_dir,'fig_6.png'), 
       dpi = 600, 
       height = 5, 
       width = 8)