Code
<- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Data/EcoDrought_SiteInformation.csv")
siteinfo <- st_as_sf(siteinfo, coords = c("long", "lat"), crs = 4326) siteinfo_sp
Purpose: Evaluate the extent and magnitude of spatial and temporal variation in headwater streamflow regimes.
Approach:
Notes:
N/A
Site information
<- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Data/EcoDrought_SiteInformation.csv")
siteinfo <- st_as_sf(siteinfo, coords = c("long", "lat"), crs = 4326) siteinfo_sp
Little g’s
<- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/LittleG_data_clean.csv") dat_clean
Big G’s
<- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/BigG_data_clean.csv") dat_clean_big
Climate
<- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/Daymet_climate.csv")
climdf <- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/Daymet_climate_summary.csv") climdf_summ
Water availability. In western, snowmelt-dominated basins, annual (water year) total yield is strongly related to summer total yield. But in eastern, rain-dominated basins, the relationship is much weaker, suggesting “faster” response to climate forcing in rain-dominated basins.
<- read_csv("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/BigG_wateravailability_annual.csv") %>%
wateravail filter(!is.na(totalyield), !is.na(totalyield_sum)) %>%
group_by(site_name) %>%
mutate(tyz_perc = percentile(totalyield_z),
tyz_sum_perc = percentile(totalyield_sum_z)) %>%
mutate(tyz_perc = ifelse(is.na(tyz_perc), 0, tyz_perc),
tyz_sum_perc = ifelse(is.na(tyz_sum_perc), 0, tyz_sum_perc))
%>%
wateravail filter(basin != "Piney River") %>%
mutate(basin = ifelse(basin == "Shields River", "Yellowstone River", basin)) %>%
mutate(basin = factor(basin, levels = c("West Brook", "Staunton River", "Paine Run", "Flathead", "Yellowstone River", "Snake River", "Donner Blitzen"))) %>%
ggplot(aes(x = tyz_perc, y = tyz_sum_perc)) +
geom_point() +
geom_smooth(method = "lm") +
xlab("Total annual yield (percentile)") + ylab("Total summer yield (percentile)") +
facet_wrap(~basin) + theme_bw()
Watersheds
<- list()
sheds_list <- list.files(path = "C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/", pattern = ".shp")
myfiles for (i in 1:length(myfiles)) {
<- st_read(paste("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/", myfiles[i], sep = ""))
sheds_list[[i]]
}<- do.call(rbind, sheds_list) %>%
sheds mutate(site_id = ifelse(site_id == "SP01", "SP07", ifelse(site_id == "SP07", "SP01", site_id))) %>%
left_join(siteinfo)
#mapview(sheds %>% arrange(desc(area_sqmi)), alpha.regions = 0.2)
For colors, order sites from downstream to upstream (roughly) and by subbasin (if appropriate)
<- c("West Brook NWIS", "West Brook Lower", "Mitchell Brook", "Jimmy Brook", "Obear Brook Lower", "West Brook Upper", "West Brook Reservoir", "Sanderson Brook", "Avery Brook", "West Whately Brook")
wborder <- c("Paine Run 10", "Paine Run 08", "Paine Run 07", "Paine Run 06", "Paine Run 02", "Paine Run 01")
paineorder <- c("Staunton River 10", "Staunton River 09", "Staunton River 07", "Staunton River 06", "Staunton River 03", "Staunton River 02")
stauntorder <- c("BigCreekLower", "LangfordCreekLower", "LangfordCreekUpper", "Big Creek NWIS", "BigCreekUpper", "HallowattCreekLower", "NicolaCreek", "WernerCreek", "Hallowat Creek NWIS", "CoalCreekLower", "CycloneCreekLower", "CycloneCreekMiddle", "CycloneCreekUpper", "CoalCreekMiddle", "CoalCreekNorth", "CoalCreekHeadwaters", "McGeeCreekLower", "McGeeCreekTrib", "McGeeCreekUpper")
flatorder <- c("Shields River Valley Ranch", "Deep Creek", "Crandall Creek", "Buck Creek", "Dugout Creek", "Shields River ab Dugout", "Lodgepole Creek", "EF Duck Creek be HF", "EF Duck Creek ab HF", "Henrys Fork")
yellorder <- c("Spread Creek Dam", "Rock Creek", "NF Spread Creek Lower", "NF Spread Creek Upper", "Grizzly Creek", "SF Spread Creek Lower", "Grouse Creek", "SF Spread Creek Upper", "Leidy Creek Mouth")
snakeorder <- c("Fish Creek NWIS", "Donner Blitzen ab Fish NWIS", "Donner Blitzen nr Burnt Car NWIS", "Donner Blitzen ab Indian NWIS") donnerorder
Currently not being used…
View daily time series data by sub-basin. Note that we are using the “Super G” NWIS data for the reference gage (black line). Per Robert comment, entirely nested design is cute, but doesn’t reflect how the data is actually used.
Big G NWIS sites/reference gages for each basin/subbasin:
%>% group_by(region, basin, subbasin) %>% summarize(site_name = unique(site_name)) %>% ungroup() %>% filter(!is.na(region)) %>% kable() dat_clean_big
region | basin | subbasin | site_name |
---|---|---|---|
Flat | Flathead | Flathead | North Fork Flathead River NWIS |
Mass | West Brook | West Brook | South River Conway NWIS |
Oreg | Donner Blitzen | Donner Blitzen | Donner Blitzen River nr Frenchglen NWIS |
Shen | Paine Run | Paine Run | South River Harriston NWIS |
Shen | Piney River | Piney River | Battle Run NWIS |
Shen | Staunton River | Staunton River | Rapidan River NWIS |
Shields | Shields River | Shields River | Yellowstone River Livingston NWIS |
Snake | Snake River | Snake River | Pacific Creek at Moran NWIS |
%>% group_by(region, basin) %>% summarize(subbasin = unique(subbasin)) %>% ungroup() #%>% filter(!is.na(region)) %>% kable() dat_clean
# A tibble: 10 × 3
region basin subbasin
<chr> <chr> <chr>
1 Flat Flathead Big Creek
2 Flat Flathead Coal Creek
3 Flat Flathead McGee Creek
4 Mass West Brook West Brook
5 Oreg Donner Blitzen Donner Blitzen
6 Shen Paine Run Paine Run
7 Shen Staunton River Staunton River
8 Shields Shields River Shields River
9 Shields Shields River Duck Creek
10 Snake Snake River Snake River
%>%
dat_clean filter(basin == "Flathead") %>%
bind_rows(dat_clean_big %>% filter(basin == "Flathead", date >= date("2017-07-29"), date <= date("2023-12-11"))) %>%
select(date, site_name, logYield) %>%
spread(key = site_name, value = logYield) %>%
relocate("North Fork Flathead River NWIS", .after = last_col()) %>%
dygraph() %>% dyRangeSelector() %>% dyAxis("y", label = "ln(Yield, mm)") %>%
#dyOptions(colors = c(brewer.pal(7, "Dark2"), "black")) %>%
dySeries("North Fork Flathead River NWIS", strokeBorderWidth = 1, strokeWidth = 1.5, color = "black")
%>%
dat_clean filter(basin == "Shields River") %>%
bind_rows(dat_clean_big %>% filter(basin == "Shields River", date >= date("2015-04-01"), date <= date("2023-12-31"))) %>%
select(date, site_name, logYield) %>%
spread(key = site_name, value = logYield) %>%
relocate("Yellowstone River Livingston NWIS", .after = last_col()) %>%
dygraph() %>% dyRangeSelector() %>% dyAxis("y", label = "ln(Yield, mm)") %>%
#dyOptions(colors = c(brewer.pal(7, "Dark2"), "black")) %>%
dySeries("Yellowstone River Livingston NWIS", strokeBorderWidth = 1, strokeWidth = 1.5, color = "black")
Create time series data plots objects
<- "grey90"
polycol <- brewer.pal(7, "Set2")
mycols
### WEST BROOK
<- dat_clean %>%
tempdat filter(basin == "West Brook") %>%
mutate(site_name = factor(site_name, levels = wborder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "West Brook", date >= date("2020-01-01"), date <= date("2025-01-03"))
tempdat_big # color
<- ggplot() +
pwb1 geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2023-07-01"), xmax = ymd("2023-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2024-07-01"), xmax = ymd("2024-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = wborder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
ylim(-3,2) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "West Brook, MA", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[1], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
pwb2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
ylim(-3,2) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "West Brook, MA", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### STAUNTON RIVER
<- dat_clean %>%
tempdat filter(basin == "Staunton River") %>%
mutate(site_name = factor(site_name, levels = stauntorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Staunton River", date >= as_date("2018-11-07"), date <= as_date("2022-10-19"))
tempdat_big # color
<- ggplot() +
pst1 geom_rect(aes(xmin = ymd("2019-07-01"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = stauntorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Staunton River, VA", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[2], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
pst2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Staunton River", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black"), panel.border = element_rect(colour = mycols[2], fill = NA, linewidth = 2))
### PAINE RUN
<- dat_clean %>%
tempdat filter(basin == "Paine Run") %>%
mutate(site_name = factor(site_name, levels = paineorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Paine Run", date >= as_date("2018-11-07"), date <= as_date("2023-05-15"))
tempdat_big # color
<- ggplot() +
ppa1 geom_rect(aes(xmin = ymd("2019-07-01"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = paineorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Paine Run, VA", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[3], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
ppa2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Paine Run", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### FLATHEAD
<- dat_clean %>%
tempdat filter(basin == "Flathead", date >= date("2018-07-29"), date <= date("2023-08-11")) %>%
mutate(site_name = factor(site_name, levels = flatorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Flathead", date >= date("2018-07-29"), date <= date("2023-08-11"))
tempdat_big # color
<- ggplot() +
pfl1 geom_rect(aes(xmin = ymd("2018-07-29"), xmax = ymd("2018-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2019-07-01"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2023-07-01"), xmax = ymd("2023-08-11"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = flatorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Flathead River, MT", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[4], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
pfl2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Flathead River", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### YELLOWSTONE
<- dat_clean %>%
tempdat filter(basin == "Shields River", date >= date("2016-06-01"), date <= date("2023-11-01")) %>%
mutate(site_name = factor(site_name, levels = yellorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Shields River", date >= date("2016-06-01"), date <= date("2023-11-01"))
tempdat_big # color
<- ggplot() +
pye1 geom_rect(aes(xmin = ymd("2016-07-01"), xmax = ymd("2016-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2017-07-01"), xmax = ymd("2017-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2018-07-01"), xmax = ymd("2018-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2019-07-01"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2023-07-01"), xmax = ymd("2023-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = yellorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Yellowstone River, MT", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[5], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
pye2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Yellowstone River, MT", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### SNAKE
<- dat_clean %>%
tempdat filter(basin == "Snake River", date >= date("2016-06-01"), date <= date("2023-10-03")) %>%
mutate(site_name = factor(site_name, levels = snakeorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Snake River", date >= date("2016-06-01"), date <= date("2023-10-03"))
tempdat_big # color
<- ggplot() +
psn1 geom_rect(aes(xmin = ymd("2016-07-01"), xmax = ymd("2016-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2017-07-01"), xmax = ymd("2017-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2018-07-01"), xmax = ymd("2018-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2019-07-01"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2023-07-01"), xmax = ymd("2023-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = snakeorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Snake River, WY", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[6], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
psn2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Snake River, WY", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### DONNER BLITZEN
<- dat_clean %>%
tempdat filter(basin == "Donner Blitzen") %>%
mutate(site_name = factor(site_name, levels = donnerorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Donner Blitzen", date >= date("2019-07-15"), date <= as_date("2022-10-30"))
tempdat_big # color
<- ggplot() +
pdb1 geom_rect(aes(xmin = ymd("2019-07-15"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = donnerorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Donner und Blitzen River, OR", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[7], fill = NA, linewidth = 1.5)
)# greyscale
<- ggplot() +
pdb2 geom_line(data = tempdat, aes(x = date, y = logYield, group = site_name), color = "grey") +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "black", size = 1) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Donner und Blitzen River", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
ggplot() +
geom_rect(aes(xmin = ymd("2019-07-15"), xmax = ymd("2019-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2020-07-01"), xmax = ymd("2020-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2021-07-01"), xmax = ymd("2021-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_rect(aes(xmin = ymd("2022-07-01"), xmax = ymd("2022-09-30"), ymin = -Inf, ymax = Inf), fill = polycol, color = NA) +
geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = donnerorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
with_outer_glow(annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Donner und Blitzen River, OR", hjust = 0, vjust = 1), colour = "white", expand = 10) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[7], fill = NA, linewidth = 1.5)
)
Generate plot
annotate_figure(egg::ggarrange(pwb1, pst1, ppa1, pfl1, pye1, psn1, pdb1, ncol = 1), left = "log(Yield, mm/day)")
Write to file
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_timeseries_new_noborder.jpg", width = 5, height = 11, units = "in", res = 1000)
annotate_figure(egg::ggarrange(pwb1, pst1, ppa1, pfl1, pye1, psn1, pdb1, ncol = 1), left = "log(Yield, mm/day)")
dev.off()
png
2
Plot time series just for summer 2020, for more detailed view
<- "grey90"
polycol <- brewer.pal(7, "Set2")
mycols
### WEST BROOK
<- dat_clean %>%
tempdat filter(basin == "West Brook", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "West Brook", date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # same yaxis scale as main time series
<- ggplot() +
pwb1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = wborder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[1], fill = NA, linewidth = 1.5)
)
### STAUNTON RIVER
<- dat_clean %>%
tempdat filter(basin == "Staunton River", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = stauntorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Staunton River", , date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # color
<- ggplot() +
pst1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = stauntorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[2], fill = NA, linewidth = 1.5)
)
### PAINE RUN
<- dat_clean %>%
tempdat filter(basin == "Paine Run", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = paineorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Paine Run", date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # color
<- ggplot() +
ppa1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = paineorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[3], fill = NA, linewidth = 1.5)
)
### FLATHEAD
<- dat_clean %>%
tempdat filter(basin == "Flathead", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = flatorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Flathead", date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # color
<- ggplot() +
pfl1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = flatorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[4], fill = NA, linewidth = 1.5)
)
### YELLOWSTONE
<- dat_clean %>%
tempdat filter(basin == "Shields River", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = yellorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Shields River", date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # color
<- ggplot() +
pye1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = yellorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[5], fill = NA, linewidth = 1.5)
)
### SNAKE
<- dat_clean %>%
tempdat filter(basin == "Snake River", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = snakeorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Snake River", date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # color
<- ggplot() +
psn1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = snakeorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[6], fill = NA, linewidth = 1.5)
)
### DONNER BLITZEN
<- dat_clean %>%
tempdat filter(basin == "Donner Blitzen", date >= date("2020-07-01"), date <= date("2020-09-30")) %>%
mutate(site_name = factor(site_name, levels = donnerorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Donner Blitzen", date >= date("2020-07-01"), date <= date("2020-09-30"))
tempdat_big # color
<- ggplot() +
pdb1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = donnerorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 7, b = 2, l = 2),
axis.text = element_text(color = "black")#, panel.border = element_rect(colour = mycols[7], fill = NA, linewidth = 1.5)
)
Write to file
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_timeseries_2020only.jpg", width = 2, height = 11, units = "in", res = 1000)
annotate_figure(egg::ggarrange(pwb1, pst1, ppa1, pfl1, pye1, psn1, pdb1, ncol = 1))
dev.off()
png
2
How does the range of (summer) flow change with water availability?
First, on daily values: (NOT EVALUATED)
<- dat_clean %>%
tempdat filter(basin == "West Brook", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "West Brook") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites == 10) %>%
p1 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth(method = "lm") +
ggtitle("West Brook") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
<- dat_clean %>%
tempdat filter(basin == "Paine Run", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "Paine Run") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites == 5) %>%
p2 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth(method = "lm") +
ggtitle("Paine Run") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
<- dat_clean %>%
tempdat filter(basin == "Staunton River", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "Staunton River") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites == 6) %>%
p3 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth(method = "lm") +
ggtitle("Staunton River") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
<- dat_clean %>%
tempdat filter(basin == "Flathead", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "Flathead") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites >= 10) %>%
p4 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth(method = "lm") +
ggtitle("Flathead River") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
<- dat_clean %>%
tempdat filter(basin == "Shields River", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "Shields River") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites == 9) %>%
p5 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth() +
ggtitle("Yellowstone River") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
<- dat_clean %>%
tempdat filter(basin == "Snake River", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "Snake River") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites == 9) %>%
p6 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth(method = "lm") +
ggtitle("Snake River") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
<- dat_clean %>%
tempdat filter(basin == "Donner Blitzen", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- tempdat %>% left_join(dat_clean_big %>% filter(basin == "Donner Blitzen") %>% select(basin, date, logYield) %>% rename(logYield_big = logYield))
tempdat <- tempdat %>% group_by(date) %>% summarize(nsites = n(), lgrange = range(logYield)[2] - range(logYield)[1], logYield_big = unique(logYield_big))
tempdat <- tempdat %>% filter(nsites == 4) %>%
p7 ggplot(aes(x = logYield_big, y = log(lgrange), group = year(date))) +
geom_point() +
geom_smooth(method = "lm") +
ggtitle("Donner Blitzen") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
annotate_figure(egg::ggarrange(p1 + theme(axis.title.x = element_blank(), axis.title.y = element_blank()),
+ theme(axis.title.x = element_blank(), axis.title.y = element_blank()),
p2 + theme(axis.title.x = element_blank(), axis.title.y = element_blank()),
p3 + theme(axis.title.x = element_blank(), axis.title.y = element_blank()),
p4 + theme(axis.title.x = element_blank(), axis.title.y = element_blank()),
p5 + theme(axis.title.x = element_blank(), axis.title.y = element_blank()),
p6 + theme(axis.title.x = element_blank(), axis.title.y = element_blank())),
p7 bottom = "log(Yield at big G)", left = "Range of little g log(Yield) (logged)")
Create function to plot interannual distribution of streamflow values, annual distributions of streamflow values, and scatterplot plot of
<- function(bas, orderr, type = c("interann", "annual", "scatter"), wtryrs) {
portfolioplot # filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% wtryrs) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4))
# interannual
<- ggplot() +
pint geom_density(data = tempdat, aes(x = logYield, y = ..scaled.., color = site_name, fill = site_name), size = 0.8) +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_fill_manual(values = alpha(cet_pal(nsites, name = "i1"), 0.1)) +
geom_density(data = tempdat_big, aes(x = logYield, y = ..scaled..), color = "grey40", fill = alpha("grey40", 0.2), size = 0.8) +
xlab("Summer log(Yield, mm/day)") + ylab("Scaled density") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none")
# annual
<- ggplot() +
pann geom_density(data = tempdat, aes(x = logYield, y = ..scaled.., color = site_name, fill = site_name), size = 0.8) +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_fill_manual(values = alpha(cet_pal(nsites, name = "i1"), 0.1)) +
geom_density(data = tempdat_big, aes(x = logYield, y = ..scaled..), color = "grey40", fill = alpha("grey40", 0.2), size = 0.8) +
xlab("Summer log(Yield, mm/day)") + ylab("Scaled density") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none") +
facet_wrap(~factor(WaterYear, levels = as.numeric(unlist(pedat %>% arrange(totalyield_sum_z) %>% select(WaterYear)))))
# portfolio effect by water availability
<- pedat %>%
ppew ggplot(aes(x = tyz_sum_perc, y = pe_range, label = wylab)) +
geom_abline(slope = 0, intercept = 0, linetype = 2) +
geom_smooth(method = "lm", color = "black") +
geom_point(shape = 21, fill = "skyblue1", size = 3) +
geom_text(vjust = -0.7, color = "grey40") +
xlab("Water availability") + ylab("Relative difference in range") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text = element_text(color = "black")) +
guides(color = guide_legend(title="Water year")) + xlim(0,100) + ylim(-1,4.5)
if(type == "interannual") { return(pint) }
if(type == "annual") { return(pann) }
if(type == "scatter") { return(ppew) }
if(type == "table") { return(pedat) }
}
Generate plots
denwb
denpa
denst
denfl
denye
densn
dendb
Plot interanntual summer log(yield) distributions for all basins
<- egg::ggarrange(
p # West Brook
portfolioplot(bas = "West Brook", orderr = wborder, type = "interannual", wtryrs = c(2020:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[1], fill = NA, linewidth = 1.5)),
# Staunton
portfolioplot(bas = "Staunton River", orderr = stauntorder, type = "interannual", wtryrs = c(2019:2022)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[2], fill = NA, linewidth = 1.5)),
# Paine
portfolioplot(bas = "Paine Run", orderr = paineorder, type = "interannual", wtryrs = c(2019:2022)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[3], fill = NA, linewidth = 1.5)),
# Flathead
portfolioplot(bas = "Flathead", orderr = flatorder, type = "interannual", wtryrs = c(2018:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[4], fill = NA, linewidth = 1.5)),
# Yellowstone
portfolioplot(bas = "Shields River", orderr = yellorder, type = "interannual", wtryrs = c(2016:2020,2022:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[5], fill = NA, linewidth = 1.5)),
# Snake
portfolioplot(bas = "Snake River", orderr = snakeorder, type = "interannual", wtryrs = c(2016:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[6], fill = NA, linewidth = 1.5)),
# Donner Blitzen
portfolioplot(bas = "Donner Blitzen", orderr = donnerorder, type = "interannual", wtryrs = c(2016:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 1, b = 2, l = 1), panel.border = element_rect(colour = mycols[7], fill = NA, linewidth = 1.5)),
nrow = 7)
# no borders
<- egg::ggarrange(
p1 # West Brook
portfolioplot(bas = "West Brook", orderr = wborder, type = "interannual", wtryrs = c(2020:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
# Staunton
portfolioplot(bas = "Staunton River", orderr = stauntorder, type = "interannual", wtryrs = c(2019:2022)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
# Paine
portfolioplot(bas = "Paine Run", orderr = paineorder, type = "interannual", wtryrs = c(2019:2022)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
# Flathead
portfolioplot(bas = "Flathead", orderr = flatorder, type = "interannual", wtryrs = c(2018:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
# Yellowstone
portfolioplot(bas = "Shields River", orderr = yellorder, type = "interannual", wtryrs = c(2016:2020,2022:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
# Snake
portfolioplot(bas = "Snake River", orderr = snakeorder, type = "interannual", wtryrs = c(2016:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
# Donner Blitzen
portfolioplot(bas = "Donner Blitzen", orderr = donnerorder, type = "interannual", wtryrs = c(2016:2024)) +
theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(),
plot.margin = margin(t = 1, r = 7, b = 2, l = 1)),
nrow = 7)
#annotate_figure(p, left = "Density")
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summerdensity_all_noborder_wide.jpg", width = 2.5, height = 11, units = "in", res = 1000)
annotate_figure(p1, left = "Density")
dev.off()
png
2
How does regional water availability affect relative difference range of streamflow values (headwaters vs. reference gages)?
Some data manipulation
# define basin-years to keep
<- bind_rows(
keepyears tibble(basin = "West Brook", WaterYear = c(2020:2024)),
tibble(basin = "Paine Run", WaterYear = c(2019:2022)),
tibble(basin = "Staunton River", WaterYear = c(2019:2022)),
tibble(basin = "Flathead", WaterYear = c(2018:2024)),
tibble(basin = "Shields River", WaterYear = c(2016:2020,2022:2024)),
tibble(basin = "Snake River", WaterYear = c(2016:2024)),
tibble(basin = "Donner Blitzen", WaterYear = c(2016:2024)),
%>% mutate(keep = "yes")
)
# standard deviation of median summer flow
# dat_clean %>%
# filter(Month %in% c(7:9)) %>%
# group_by(basin, site_name, WaterYear) %>%
# summarize(medyield = median(logYield, na.rm = TRUE)) %>%
# ungroup() %>%
# group_by(basin, WaterYear) %>%
# summarize(sdyield = sd(medyield), nsites = n()) %>%
# ungroup() %>%
# left_join(wateravail %>% select(basin, WaterYear, totalyield:tyz_sum_perc)) %>%
# left_join(keepyears) %>% filter(keep == "yes") %>%
# mutate(basin = ifelse(basin == "Shields River", "Yellowstone River",
# ifelse(basin == "Flathead", "Flathead River", basin))) %>%
# mutate(basin = factor(basin, levels = c("West Brook", "Piney River", "Staunton River", "Paine Run", "Flathead River", "Yellowstone River", "Snake River", "Donner Blitzen"))) %>%
# ggplot(aes(x = tyz_sum_perc, y = sdyield)) +
# geom_smooth(method = "lm", color = "black", aes(weight = nsites)) +
# geom_point(aes(fill = basin, size = nsites), shape = 21) +
# scale_fill_brewer(palette = "Set2") +
# #facet_wrap(~basin) +
# theme_bw() + theme(panel.grid = element_blank())
# calculate relative difference in range as above
<- dat_clean %>%
mydat filter(Month %in% c(7:9)) %>%
group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1]) %>%
ungroup() %>%
left_join(dat_clean_big %>%
filter(Month %in% c(7:9)) %>%
group_by(basin, WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1]) %>%
ungroup()) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange)*100) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield:tyz_sum_perc)) %>%
left_join(keepyears) %>% filter(keep == "yes") %>%
mutate(basin = ifelse(basin == "Shields River", "Yellowstone River",
ifelse(basin == "Flathead", "Flathead River",
ifelse(basin == "Donner Blitzen", "Donner-Blitzen River", basin)))) %>%
mutate(basin = factor(basin, levels = c("West Brook", "Staunton River", "Paine Run",
"Flathead River", "Yellowstone River", "Snake River", "Donner-Blitzen River")))
mydat
# A tibble: 38 × 14
basin WaterYear nsites littlerange bigrange pe_range site_name totalyield
<fct> <dbl> <int> <dbl> <dbl> <dbl> <chr> <dbl>
1 Donner-B… 2019 4 0.332 0.583 -43.1 Donner B… 278.
2 Donner-B… 2020 4 0.605 0.516 17.3 Donner B… 152.
3 Donner-B… 2021 4 0.474 0.336 41.1 Donner B… 122.
4 Donner-B… 2022 4 0.741 0.597 24.0 Donner B… 125.
5 Flathead… 2018 18 1.82 0.783 133. North Fo… 654.
6 Flathead… 2019 19 2.47 0.668 269. North Fo… 448.
7 Flathead… 2020 19 3.49 1.11 214. North Fo… 605.
8 Flathead… 2021 17 2.76 0.756 265. North Fo… 483.
9 Flathead… 2022 16 2.76 1.11 149. North Fo… 793.
10 Flathead… 2023 9 1.94 0.451 331. North Fo… 372.
# ℹ 28 more rows
# ℹ 6 more variables: totalyield_z <dbl>, totalyield_sum <dbl>,
# totalyield_sum_z <dbl>, tyz_perc <dbl>, tyz_sum_perc <dbl>, keep <chr>
Show simple linear model summary, weighted by number of sites
summary(lm(pe_range ~ tyz_sum_perc, data = mydat, weights = nsites))
Call:
lm(formula = pe_range ~ tyz_sum_perc, data = mydat, weights = nsites)
Weighted Residuals:
Min 1Q Median 3Q Max
-503.62 -205.22 -25.09 108.84 639.45
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 239.1231 26.7291 8.946 1.12e-10 ***
tyz_sum_perc -1.8174 0.5199 -3.496 0.00127 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 262.6 on 36 degrees of freedom
Multiple R-squared: 0.2534, Adjusted R-squared: 0.2327
F-statistic: 12.22 on 1 and 36 DF, p-value: 0.001273
Show distribution of spatial streamflow heterogeneity by basin. Lots of structuring by basin, driven in large part by Staunton and Donner-Blitzen Rivers.
par(mar = c(9,4,0.5,0.5))
boxplot(pe_range ~ basin, data = mydat, ylab = "Spatial streamflow heterogeneity", xlab = "", las = 2, col = mycols)
Use a random slope/random intercept mixed effects model to estimate the among-basin mean effect of regional water availability on spatial streamflow heterogeneity.
Notes:
<- mydat %>% mutate(z_tyz_sum_perc = scale(tyz_sum_perc))
mydat <- lmer(pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin), data = mydat)
lmod summary(lmod)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin)
Data: mydat
REML criterion at convergence: 430.4
Scaled residuals:
Min 1Q Median 3Q Max
-1.5512 -0.4206 -0.1253 0.2584 2.8102
Random effects:
Groups Name Variance Std.Dev. Corr
basin (Intercept) 7810.1 88.37
z_tyz_sum_perc 609.8 24.69 -0.92
Residual 5127.9 71.61
Number of obs: 38, groups: basin, 7
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 133.13 35.60 5.51 3.740 0.0113 *
z_tyz_sum_perc -45.39 16.29 3.62 -2.787 0.0554 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Correlation of Fixed Effects:
(Intr)
z_tyz_sm_pr -0.521
# r.squaredGLMM(lmod)
Get p-values for global slope and intercept: (doesn’t to run in Quarto…works fine in R)
coef(summary(as_lmerModLmerTest(lmod)))
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 133.13376 35.60169 5.510014 3.739534 0.01125212
z_tyz_sum_perc -45.39251 16.28830 3.620345 -2.786817 0.05538425
Plot relationship between spatial streamflow heterogeneity and regional water availability with gloabl (among-population mean) regression line.
# get predicted values and 95% credible interval
<- effects::effect(term = "z_tyz_sum_perc", mod = as_lmerModLmerTest(lmod), xlevels = list(z_tyz_sum_perc = seq(min(mydat$z_tyz_sum_perc), max(mydat$z_tyz_sum_perc), length.out = 1000)), se = list(level = 0.95))
effects_tyz <- as_tibble(effects_tyz) %>% mutate(tyz_sum_perc = (z_tyz_sum_perc * attr(mydat$z_tyz_sum_perc, "scaled:scale")) + attr(mydat$z_tyz_sum_perc, "scaled:center"))
x_tyz
# trim data for panel labesl
<- bind_rows(mydat %>% filter(basin == "West Brook", WaterYear %in% c(2020,2021)),
mydat_labs %>% filter(basin == "Snake River", WaterYear %in% c(2021,2022))) %>%
mydat mutate(labs = c("b", "c", "d", "e"))
# plot
<- ggplot() +
randiffplot geom_ribbon(data = x_tyz, aes(x = tyz_sum_perc, ymin = lower, ymax = upper), fill = "grey80") +
geom_line(data = x_tyz, aes(x = tyz_sum_perc, y = fit), color = "black", size = 1.25, lineend = "round") +
geom_point(data = mydat, aes(x = tyz_sum_perc, y = pe_range, fill = basin, size = nsites), shape = 21) +
scale_fill_brewer(palette = "Set2") +
geom_text(data = mydat_labs, aes(x = tyz_sum_perc, y = pe_range, label = labs), size = 3) +
theme_bw() + theme(panel.grid = element_blank(), axis.text = element_text(color = "black")) +
ylab("Spatial streamflow heterogeneity (percent difference)") + xlab("Water availability (percentile)") +
guides(fill = guide_legend(title = "Basin", override.aes = list(size = 5), order = 1), size = guide_legend(title = "Number of sites", order = 2)) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed")
randiffplot
# write to file
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_RangeDiff_allsites2.jpg", width = 4.75, height = 5, units = "in", res = 1000)
randiffplotdev.off()
png
2
Use rptR to decompose variance in spatial streamflow heterogeneity into fixed (regional water availability) and random (basin) effect sources:
<- rptGaussian(pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin), data = mydat, grname = c("basin", "Fixed"), ratio = TRUE, adjusted = FALSE, nboot = 1000) rmod
Bootstrap Progress:
print(rmod)
Repeatability estimation using the lmm method
Repeatability for basin
R = 0.539
SE = 0.169
CI = [0.154, 0.801]
P = 0.00764 [LRT]
NA [Permutation]
Repeatability for Fixed
R = 0.132
SE = 0.099
CI = [0.012, 0.378]
P = NA [LRT]
NA [Permutation]
$mod rmod
Linear mixed model fit by REML ['lmerMod']
Formula: pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin)
Data: data
REML criterion at convergence: 430.4229
Random effects:
Groups Name Std.Dev. Corr
basin (Intercept) 88.37
z_tyz_sum_perc 24.69 -0.92
Residual 71.61
Number of obs: 38, groups: basin, 7
Fixed Effects:
(Intercept) z_tyz_sum_perc
133.13 -45.39
plot(rmod, grname = "basin")
plot(rmod, grname = "Fixed")
The strong effect of basin is largely driven by Staunton and Donner-Blitzen Rivers. Without those basins, random effect variance shrinks and fixed effect variance expands considerably. Much of this pattern is likely due to low sample sizes (few headwater gages in these basins, particularly in the Donner-Blitzen)
<- rptGaussian(pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin), data = mydat %>% filter(!basin %in% c("Staunton River", "Donner-Blitzen River")), grname = c("basin", "Fixed"), ratio = TRUE, adjusted = FALSE, nboot = 1000) rmod
Bootstrap Progress:
print(rmod)
Repeatability estimation using the lmm method
Repeatability for basin
R = 0.037
SE = 0.11
CI = [0, 0.392]
P = 1 [LRT]
NA [Permutation]
Repeatability for Fixed
R = 0.304
SE = 0.132
CI = [0.062, 0.574]
P = NA [LRT]
NA [Permutation]
How sensitive are these results to the choice of data (log) transformation, sensu comment from John Hammond during internal review?
Summary: While the among-network mean effect of water availability on heterogeneity was less significant using un-logged discharge data (p > 0.05), this appeared to be driven by the highly non-normal distribution of raw discharge values, as the reviewer indicated. Importantly, the magnitude of the effect is similar and the qualitative results are unchanged (negative slope).
Data manipulation: use un-logged/raw Yield data to calculation spatial heterogeneity, also use CV rather than ranges
<- dat_clean %>%
mydat2 filter(Month %in% c(7:9)) %>%
group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(Yield_mm)[2]-range(Yield_mm)[1],
littlecv = sd(Yield_mm)/mean(Yield_mm)) %>%
ungroup() %>%
left_join(dat_clean_big %>%
filter(Month %in% c(7:9)) %>%
group_by(basin, WaterYear) %>%
summarize(bigrange = range(Yield_mm)[2]-range(Yield_mm)[1],
bigcv = sd(Yield_mm)/mean(Yield_mm)) %>%
ungroup()) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange)*100,
pe_cv = ((littlecv-bigcv)/bigcv)*100) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield:tyz_sum_perc)) %>%
left_join(keepyears) %>% filter(keep == "yes") %>%
mutate(basin = ifelse(basin == "Shields River", "Yellowstone River",
ifelse(basin == "Flathead", "Flathead River",
ifelse(basin == "Donner Blitzen", "Donner-Blitzen River", basin)))) %>%
mutate(basin = factor(basin, levels = c("West Brook", "Staunton River", "Paine Run",
"Flathead River", "Yellowstone River", "Snake River", "Donner-Blitzen River")))
Fig the mmixed effects model
<- mydat2 %>% mutate(z_tyz_sum_perc = scale(tyz_sum_perc))
mydat2 <- lmer(pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin), data = mydat2)
lmod summary(lmod)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: pe_range ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin)
Data: mydat2
REML criterion at convergence: 523.5
Scaled residuals:
Min 1Q Median 3Q Max
-1.8092 -0.4147 -0.1069 0.3663 3.7590
Random effects:
Groups Name Variance Std.Dev. Corr
basin (Intercept) 79567 282.1
z_tyz_sum_perc 19495 139.6 -1.00
Residual 70913 266.3
Number of obs: 38, groups: basin, 7
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 238.131 116.273 4.215 2.048 0.106
z_tyz_sum_perc -86.826 72.670 2.761 -1.195 0.325
Correlation of Fixed Effects:
(Intr)
z_tyz_sm_pr -0.703
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
Plot
# get predicted values and 95% credible interval
<- effects::effect(term = "z_tyz_sum_perc", mod = as_lmerModLmerTest(lmod), xlevels = list(z_tyz_sum_perc = seq(min(mydat2$z_tyz_sum_perc), max(mydat2$z_tyz_sum_perc), length.out = 1000)), se = list(level = 0.95))
effects_tyz <- as_tibble(effects_tyz) %>% mutate(tyz_sum_perc = (z_tyz_sum_perc * attr(mydat2$z_tyz_sum_perc, "scaled:scale")) + attr(mydat2$z_tyz_sum_perc, "scaled:center"))
x_tyz
# trim data for panel labesl
<- bind_rows(mydat2 %>% filter(basin == "West Brook", WaterYear %in% c(2020,2021)),
mydat_labs %>% filter(basin == "Snake River", WaterYear %in% c(2021,2022))) %>%
mydat2 mutate(labs = c("b", "c", "d", "e"))
# plot
ggplot() +
geom_ribbon(data = x_tyz, aes(x = tyz_sum_perc, ymin = lower, ymax = upper), fill = "grey80") +
geom_line(data = x_tyz, aes(x = tyz_sum_perc, y = fit), color = "black", size = 1.25, lineend = "round") +
geom_point(data = mydat2, aes(x = tyz_sum_perc, y = pe_range, fill = basin, size = nsites), shape = 21) +
scale_fill_brewer(palette = "Set2") +
theme_bw() + theme(panel.grid = element_blank(), axis.text = element_text(color = "black")) +
ylab("Spatial streamflow heterogeneity (percent difference)") + xlab("Water availability (percentile)") +
guides(fill = guide_legend(title = "Basin", override.aes = list(size = 5), order = 1), size = guide_legend(title = "Number of sites", order = 2)) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed")
Fig the mmixed effects model
<- mydat2 %>% mutate(z_tyz_sum_perc = scale(tyz_sum_perc))
mydat2 <- lmer(pe_cv ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin), data = mydat2)
lmod summary(lmod)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: pe_cv ~ z_tyz_sum_perc + (1 + z_tyz_sum_perc | basin)
Data: mydat2
REML criterion at convergence: 450.7
Scaled residuals:
Min 1Q Median 3Q Max
-2.4210 -0.3359 0.0006 0.2983 3.9794
Random effects:
Groups Name Variance Std.Dev. Corr
basin (Intercept) 24752 157.33
z_tyz_sum_perc 8948 94.59 -1.00
Residual 7991 89.39
Number of obs: 38, groups: basin, 7
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 88.405 61.551 5.248 1.436 0.208
z_tyz_sum_perc -55.189 39.739 3.675 -1.389 0.243
Correlation of Fixed Effects:
(Intr)
z_tyz_sm_pr -0.889
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
Plot
# get predicted values and 95% credible interval
<- effects::effect(term = "z_tyz_sum_perc", mod = as_lmerModLmerTest(lmod), xlevels = list(z_tyz_sum_perc = seq(min(mydat2$z_tyz_sum_perc), max(mydat2$z_tyz_sum_perc), length.out = 1000)), se = list(level = 0.95))
effects_tyz <- as_tibble(effects_tyz) %>% mutate(tyz_sum_perc = (z_tyz_sum_perc * attr(mydat2$z_tyz_sum_perc, "scaled:scale")) + attr(mydat2$z_tyz_sum_perc, "scaled:center"))
x_tyz
# trim data for panel labesl
<- bind_rows(mydat2 %>% filter(basin == "West Brook", WaterYear %in% c(2020,2021)),
mydat_labs %>% filter(basin == "Snake River", WaterYear %in% c(2021,2022))) %>%
mydat2 mutate(labs = c("b", "c", "d", "e"))
# plot
ggplot() +
geom_ribbon(data = x_tyz, aes(x = tyz_sum_perc, ymin = lower, ymax = upper), fill = "grey80") +
geom_line(data = x_tyz, aes(x = tyz_sum_perc, y = fit), color = "black", size = 1.25, lineend = "round") +
geom_point(data = mydat2, aes(x = tyz_sum_perc, y = pe_cv, fill = basin, size = nsites), shape = 21) +
scale_fill_brewer(palette = "Set2") +
theme_bw() + theme(panel.grid = element_blank(), axis.text = element_text(color = "black")) +
ylab("Spatial streamflow heterogeneity (percent difference)") + xlab("Water availability (percentile)") +
guides(fill = guide_legend(title = "Basin", override.aes = list(size = 5), order = 1), size = guide_legend(title = "Number of sites", order = 2)) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed")
<- "West Brook"
bas <- wborder
orderr <- c(2020:2024)
wtryrs
# sheds and network
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Mass_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "WBR",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Mass_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# get lakes
<- get_waterbodies(AOI = siteinfo_sp %>% filter(site_name == "West Brook NWIS"), buffer = 10000)
lakes <- lakes %>% filter(gnis_name %in% c("Northampton Reservoir Upper", "Northampton Reservoir"))
lakes #st_write(lakes, "C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Study area maps/lakes/lakes_WestBrook.shp")
# little g points
<- siteinfo_sp %>% filter(site_name %in% wborder) %>% mutate(site_name = factor(site_name, levels = wborder))
mylittleg
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# calculate long-term median of summer median flow, to center color scheme
<- tempdat_big %>%
annmed_big group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
<- median(annmed_big$medlogYield)
annmed_big
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_wb for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_wb[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
#scale_fill_gradientn(colours = rev(hcl.colors(100, "Zissou1")), limits = range(annmed$medlogYield), na.value = "grey") +
#scale_fill_gradientn(colours = cet_pal(100, name = "l16"), limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = lakes, color = "white", fill = "lightskyblue1", linewidth = 0.7) +
geom_sf(data = lakes, color = "royalblue4", fill = "lightskyblue1", linewidth = 0.5) +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = Inf, y = Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = 1.15, hjust = 1.05, size = 5)})
}ggarrange(plotlist = plotlist_wb, common.legend = TRUE, legend = "right")
<- "Paine Run"
bas <- paineorder
orderr <- c(2019:2022)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Shen_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "PA_10FL",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Shen_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# hillshade
<- rast("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Data/Spatial data/Elevation/Shenandoah_DEM_10m_nc.tif")
myrast <- mask(crop(myrast, mysheds), mysheds)
myrast <- terrain(myrast, "slope", unit = "radians")
slo <- terrain(myrast, "aspect", unit = "radians")
asp <- shade(slope = slo, aspect = asp, angle = 40, direction = 270)
hill <- as.data.frame(hill, xy = TRUE)
hilldf
# little g points
<- siteinfo_sp %>% filter(site_name %in% orderr)
mylittleg
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_pa for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_pa[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = -Inf, y = Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = 1.15, hjust = -0.05, size = 5)})
}ggarrange(plotlist = plotlist_pa, common.legend = TRUE, legend = "right")
<- "Staunton River"
bas <- stauntorder
orderr <- c(2019:2022)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Shen_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "SR_10FL",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Shen_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# little g points
<- siteinfo_sp %>% filter(site_name %in% orderr)
mylittleg
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_st for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_st[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = Inf, y = Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = 1.15, hjust = 1.05, size = 5)})
}ggarrange(plotlist = plotlist_st, common.legend = TRUE, legend = "right")
<- "Flathead"
bas <- flatorder
orderr <- c(2018:2024)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Flat_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "NFF",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Flat_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# get lakes
<- get_waterbodies(AOI = siteinfo_sp %>% filter(site_name == "North Fork Flathead River NWIS"), buffer = 100000)
lakes <- st_transform(lakes, crs(mysheds))
lakes <- st_intersection(lakes, st_as_sf(mysheds))
lakes <- lakes %>% filter(gnis_name %in% c("Moose Lake", "Mud Lake"))
lakes
# points
<- siteinfo_sp %>% filter(site_name %in% flatorder) %>% mutate(site_name = factor(site_name, levels = flatorder))
mylittleg st_geometry(mylittleg)[mylittleg$site_name == "BigCreekUpper"] <- st_point(c(-114.31506, 48.57672))
st_geometry(mylittleg)[mylittleg$site_name == "HallowattCreekLower"] <- st_point(c(-114.31914, 48.57256))
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_fl for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_fl[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = Inf, y = Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = 1.15, hjust = 1.05, size = 5)})
}ggarrange(plotlist = plotlist_fl, common.legend = TRUE, legend = "right")
<- "Shields River"
bas <- yellorder
orderr <- c(2016:2020,2022:2024)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Shields_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id %in% c("SRS", "DU01"),]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Shields_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# points
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% mutate(site_name = factor(site_name, levels = orderr)) #%>% filter(subbasin != "Duck Creek")
mylittleg
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_ye for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_ye[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = -Inf, y = -Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = -0.15, hjust = -0.05, size = 5)})
}ggarrange(plotlist = plotlist_ye, common.legend = TRUE, legend = "right", nrow = 2, ncol = 4)
<- "Snake River"
bas <- snakeorder
orderr <- c(2016:2024)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Snake_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "SP11",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Snake_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# get lakes
<- get_waterbodies(AOI = siteinfo_sp %>% filter(site_name == "Spread Creek Dam"), buffer = 100000)
lakes <- st_transform(lakes, crs(mysheds))
lakes <- st_intersection(lakes, st_as_sf(mysheds))
lakes <- lakes %>% filter(gnis_name %in% c("Leidy Lake"))
lakes
# points
<- siteinfo_sp %>% filter(site_name %in% snakeorder) %>% mutate(site_name = factor(site_name, levels = snakeorder))
mylittleg # edit geometry to reduce overlap
st_geometry(mylittleg)[mylittleg$site_name == "SF Spread Creek Lower NWIS"] <- st_point(c(-110.32226, 43.76118))
st_geometry(mylittleg)[mylittleg$site_name == "NF Spread Creek Lower"] <- st_point(c(-110.3199, 43.766533))
st_geometry(mylittleg)[mylittleg$site_name == "Grizzly Creek"] <- st_point(c(-110.23289, 43.77433))
st_geometry(mylittleg)[mylittleg$site_name == "NF Spread Creek Upper"] <- st_point(c(-110.23405, 43.77227))
st_geometry(mylittleg)[mylittleg$site_name == "SF Spread Creek Upper"] <- st_point(c(-110.31475, 43.73661))
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_sn for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_sn[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = -Inf, y = -Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = -0.15, hjust = -0.05, size = 5)})
}ggarrange(plotlist = plotlist_sn, common.legend = TRUE, legend = "right")
<- "Donner Blitzen"
bas <- c(donnerorder, "Donner Blitzen River nr Frenchglen NWIS")
orderr <- c(2016:2024)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Oreg_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "DBF",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Oreg_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# points
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% mutate(site_name = factor(site_name, levels = donnerorder))
mylittleg # edit geometry to reduce overlap
st_geometry(mylittleg)[mylittleg$site_name == "Donner Blitzen ab Fish NWIS"] <- st_point(c(-118.84315, 42.75476))
st_geometry(mylittleg)[mylittleg$site_name == "Fish Creek"] <- st_point(c(-118.83173, 42.75911))
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup() %>%
bind_rows(tempdat_big %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup())
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_db for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_db[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
annotate("label", x = -Inf, y = -Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = -0.15, hjust = -0.05, size = 5)})
}ggarrange(plotlist = plotlist_db, common.legend = TRUE, legend = "right")
2020/2021 summer flow distributions
<- "West Brook"
bas <- wborder
orderr <- c(2020,2021)
wtryrs
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% wtryrs) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# annual
<- ggplot() +
pann geom_density(data = tempdat, aes(x = logYield, y = ..scaled.., color = site_name, fill = site_name), size = 0.8) +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_fill_manual(values = alpha(cet_pal(nsites, name = "i1"), 0.1)) +
geom_density(data = tempdat_big, aes(x = logYield, y = ..scaled..), color = "grey40", fill = alpha("grey40", 0.2), size = 0.8) +
xlab("Summer log(Yield, mm/day)") + ylab("Density") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text.y = element_blank(), axis.ticks.y = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none",
strip.background = element_blank(), strip.text = element_blank()) +
facet_wrap(~factor(WaterYear, levels = as.numeric(unlist(pedat %>% arrange(totalyield_sum_z) %>% select(WaterYear)))), ncol = 1)
print(pann)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summerdensity_WB_annual.jpg", width = 2.75, height = 5, units = "in", res = 1000)
panndev.off()
png
2
2020/2021 summer flow distributions
<- "West Brook"
bas <- wborder
orderr <- c(2020,2021)
wtryrs
# sheds and network
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Mass_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "WBR",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Mass_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# get lakes
<- get_waterbodies(AOI = siteinfo_sp %>% filter(site_name == "West Brook NWIS"), buffer = 10000)
lakes <- lakes %>% filter(gnis_name %in% c("Northampton Reservoir Upper", "Northampton Reservoir"))
lakes
# little g points
<- siteinfo_sp %>% filter(site_name %in% wborder) %>% mutate(site_name = factor(site_name, levels = wborder))
mylittleg
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_wb for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_wb[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = lakes, color = "white", fill = "lightskyblue1", linewidth = 0.7) +
geom_sf(data = lakes, color = "royalblue4", fill = "lightskyblue1", linewidth = 0.5) +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002))
#annotate("label", x = Inf, y = Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = 1.15, hjust = 1.05, size = 5)
})
}<- ggarrange(plotlist = plotlist_wb, common.legend = TRUE, legend = "right", nrow = 2)
p print(p)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summermedianmap_WB_annual.jpg", width = 4, height = 6, units = "in", res = 1000)
pdev.off()
png
2
2021/2022 summer flow distributions
<- "Snake River"
bas <- snakeorder
orderr <- c(2021,2022)
wtryrs
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% wtryrs) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# annual
<- ggplot() +
pann geom_density(data = tempdat, aes(x = logYield, y = ..scaled.., color = site_name, fill = site_name), size = 0.8) +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
scale_fill_manual(values = alpha(cet_pal(nsites, name = "i1"), 0.1)) +
geom_density(data = tempdat_big, aes(x = logYield, y = ..scaled..), color = "grey40", fill = alpha("grey40", 0.2), size = 0.8) +
xlab("Summer log(Yield, mm/day)") + ylab("Density") +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.text.y = element_blank(), axis.ticks.y = element_blank(),
axis.text = element_text(color = "black"), legend.position = "none",
strip.background = element_blank(), strip.text = element_blank()) +
facet_wrap(~factor(WaterYear, levels = as.numeric(unlist(pedat %>% arrange(totalyield_sum_z) %>% select(WaterYear)))), ncol = 1)
print(pann)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summerdensity_Snake_annual.jpg", width = 2.75, height = 5, units = "in", res = 1000)
panndev.off()
png
2
2022/2022 summer flow distributions
<- "Snake River"
bas <- snakeorder
orderr <- c(2021,2022)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Snake_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "SP11",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Snake_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# get lakes
<- get_waterbodies(AOI = siteinfo_sp %>% filter(site_name == "Spread Creek Dam"), buffer = 100000)
lakes <- st_transform(lakes, crs(mysheds))
lakes <- st_intersection(lakes, st_as_sf(mysheds))
lakes <- lakes %>% filter(gnis_name %in% c("Leidy Lake"))
lakes
# points
<- siteinfo_sp %>% filter(site_name %in% snakeorder) %>% mutate(site_name = factor(site_name, levels = snakeorder))
mylittleg # edit geometry to reduce overlap
st_geometry(mylittleg)[mylittleg$site_name == "SF Spread Creek Lower NWIS"] <- st_point(c(-110.32226, 43.76118))
st_geometry(mylittleg)[mylittleg$site_name == "NF Spread Creek Lower"] <- st_point(c(-110.3199, 43.766533))
st_geometry(mylittleg)[mylittleg$site_name == "Grizzly Creek"] <- st_point(c(-110.23289, 43.77433))
st_geometry(mylittleg)[mylittleg$site_name == "NF Spread Creek Upper"] <- st_point(c(-110.23405, 43.77227))
st_geometry(mylittleg)[mylittleg$site_name == "SF Spread Creek Upper"] <- st_point(c(-110.31475, 43.73661))
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_wb for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_wb[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = lakes, color = "white", fill = "lightskyblue1", linewidth = 0.7) +
geom_sf(data = lakes, color = "royalblue4", fill = "lightskyblue1", linewidth = 0.5) +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002))
#annotate("label", x = Inf, y = Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = 1.15, hjust = 1.05, size = 5)
})
}<- ggarrange(plotlist = plotlist_wb, common.legend = TRUE, legend = "right", nrow = 2)
p print(p)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summermedianmap_Snake_annual.jpg", width = 4, height = 6, units = "in", res = 1000)
pdev.off()
png
2
Combine interannual distributions of summer flow, scatterplots showing relationship between water availability and relative range among little g’s, and maps of median summer flow in a low and high water year
Redraw Yellowstone to move upper Shields and Duck Creek closer together
<- "Shields River"
bas <- yellorder
orderr <- c(2016:2020,2022:2024)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Shields_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id %in% c("SRS", "DU01"),]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Shields_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# points
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% mutate(site_name = factor(site_name, levels = orderr)) #%>% filter(subbasin != "Duck Creek")
mylittleg
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# 2020
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == 2020))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == 2020)) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- ggplot() +
mainmap geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = c(-110.555,-110.30), ylim = c(46.07,46.23)) +
theme_bw() + theme_void() +
theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text = element_blank()) +
scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) +
annotate("label", x = -Inf, y = Inf, label = "2020 (47%)", vjust = 1.15, hjust = -0.05, size = 5)
<- local({
dbp1 <- i
i ggdraw(mainmap + theme(legend.position = "none")) +
draw_plot(
{ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = c(-110.31,-110.23), ylim = c(45.865,45.96)) +
theme_bw() + theme_void() + theme(legend.position = "none") +
scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002))
},x = 0.05, y = 0, width = 0.3, height = 0.5)
})
# 2017
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == 2017))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == 2017)) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- ggplot() +
mainmap geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = c(-110.555,-110.30), ylim = c(46.07,46.23)) +
theme_bw() + theme_void() +
theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text = element_blank()) +
scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) +
annotate("label", x = -Inf, y = Inf, label = "2017 (67%)", vjust = 1.15, hjust = -0.05, size = 5)
<- local({
dbp2 <- i
i ggdraw(mainmap + theme(legend.position = "none")) +
draw_plot(
{ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "G", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = c(-110.31,-110.23), ylim = c(45.865,45.96)) +
theme_bw() + theme_void() + theme(legend.position = "none") +
scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002))
},x = 0.05, y = 0, width = 0.3, height = 0.5)
})#ggarrange(dbp1, dbp2, as_ggplot(ggpubr::get_legend(mainmap)), nrow = 1, widths = c(1,1,0.2))
Get pieces
# West Brook
<- ggarrange(portfolioplot(bas = "West Brook", orderr = wborder, type = "interannual", wtryrs = c(2020:2024)) + theme(axis.title.x = element_blank()),
p1 portfolioplot(bas = "West Brook", orderr = wborder, type = "scatter", wtryrs = c(2020:2024)) + theme(axis.title.x = element_blank()),
ggarrange(plotlist_wb[[2]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none"),
4]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none")),
plotlist_wb[[widths = c(1,1,2), align = "h", nrow = 1)
# Paine
<- ggarrange(portfolioplot(bas = "Paine Run", orderr = paineorder, type = "interannual", wtryrs = c(2019:2022)) + theme(axis.title.x = element_blank()),
p2 portfolioplot(bas = "Paine Run", orderr = paineorder, type = "scatter", wtryrs = c(2019:2022)) + theme(axis.title.x = element_blank()),
ggarrange(plotlist_pa[[1]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none"),
4]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none")),
plotlist_pa[[widths = c(1,1,2), align = "h", nrow = 1)
# Staunton
<- ggarrange(portfolioplot(bas = "Staunton River", orderr = stauntorder, type = "interannual", wtryrs = c(2019:2022)) + theme(axis.title.x = element_blank()),
p3 portfolioplot(bas = "Staunton River", orderr = stauntorder, type = "scatter", wtryrs = c(2019:2022)) + theme(axis.title.x = element_blank()),
ggarrange(plotlist_st[[1]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none"),
4]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none")),
plotlist_st[[widths = c(1,1,2), align = "h", nrow = 1)
# Flathead
<- ggarrange(portfolioplot(bas = "Flathead", orderr = flatorder, type = "interannual", wtryrs = c(2018:2024)) + theme(axis.title.x = element_blank()),
p4 portfolioplot(bas = "Flathead", orderr = flatorder, type = "scatter", wtryrs = c(2018:2024)) + theme(axis.title.x = element_blank()),
ggarrange(plotlist_fl[[2]] + theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none"),
6]] + theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none")),
plotlist_fl[[widths = c(1,1,2), align = "h", nrow = 1)
# Yellowstone
<- ggarrange(portfolioplot(bas = "Shields River", orderr = yellorder, type = "interannual", wtryrs = c(2016:2020,2022:2024)) + theme(axis.title.x = element_blank()),
p5 portfolioplot(bas = "Shields River", orderr = yellorder, type = "scatter", wtryrs = c(2016:2020,2022:2024)) + theme(axis.title.x = element_blank()),
ggarrange(dbp1, dbp2, nrow = 1),
widths = c(1,1,2), align = "h", nrow = 1)
# Snake River
<- ggarrange(portfolioplot(bas = "Snake River", orderr = snakeorder, type = "interannual", wtryrs = c(2016:2024)) + theme(axis.title.x = element_blank()),
p6 portfolioplot(bas = "Snake River", orderr = snakeorder, type = "scatter", wtryrs = c(2016:2024)) + theme(axis.title.x = element_blank()),
ggarrange(plotlist_sn[[1]] + theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none"),
5]] + theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002)) + theme(legend.position = "none")),
plotlist_sn[[widths = c(1,1,2), align = "h", nrow = 1)
# Donner Blitzen
<- ggarrange(portfolioplot(bas = "Donner Blitzen", orderr = donnerorder, type = "interannual", wtryrs = c(2016:2024)),
p7 portfolioplot(bas = "Donner Blitzen", orderr = donnerorder, type = "scatter", wtryrs = c(2016:2024)),
ggarrange(plotlist_db[[1]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.003, 0.003)) + theme(legend.position = "none"),
4]] + theme_void() + scale_x_continuous(expand = c(0.002, 0.002)) + scale_y_continuous(expand = c(0.003, 0.003)) + theme(legend.position = "none")),
plotlist_db[[widths = c(1,1,2), align = "h", nrow = 1)
::ggarrange(p1, p2, p3, p4, p5, p6, p7, nrow = 7) egg
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/EcoD_Obj1_bigplot.jpg", width = 12, height = 20, units = "in", res = 1000)
::ggarrange(p1, p2, p3, p4, p5, p6, p7, nrow = 7)
eggdev.off()
Time series plots, West Brook and Flathead
### FLATHEAD
<- dat_clean %>%
tempdat filter(basin == "Flathead", date >= date("2018-07-29"), date <= date("2023-08-11")) %>%
mutate(site_name = factor(site_name, levels = flatorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Flathead", date >= date("2018-07-29"), date <= date("2023-08-11"))
tempdat_big # color
<- ggplot() +
pfl1 geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = flatorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
ylim(-3,2) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Flathead River", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
<- annotate_figure(egg::ggarrange(pwb1, pfl1 + ylim(-2.4,1.72), ncol = 1), left = "log(Yield, mm/day)")
p print(p)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_timeseries_WBFlat.jpg", width = 8, height = 5, units = "in", res = 1000)
pdev.off()
png
2
#### NO LITTLE Gs
### WEST BROOK
<- dat_clean %>%
tempdat filter(basin == "West Brook") %>%
mutate(site_name = factor(site_name, levels = wborder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "West Brook", date >= date("2020-01-01"), date <= date("2025-01-03"))
tempdat_big # color
<- ggplot() +
pwb1_nlg #geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = wborder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
ylim(-3,2) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "The West Brook", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### FLATHEAD
<- dat_clean %>%
tempdat filter(basin == "Flathead", date >= date("2018-07-29"), date <= date("2023-08-11")) %>%
mutate(site_name = factor(site_name, levels = flatorder))
<- fill_missing_dates(tempdat, dates = date, groups = site_name, pad_ends = FALSE)
tempdat <- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Flathead", date >= date("2018-07-29"), date <= date("2023-08-11"))
tempdat_big # color
<- ggplot() +
pfl1_nlg #geom_line(data = tempdat, aes(x = date, y = logYield, color = factor(site_name, levels = flatorder))) +
geom_line(data = tempdat_big, aes(x = date, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
ylim(-2.4,1.72) +
annotate("text", x = min(c(tempdat_big$date, tempdat$date), na.rm = TRUE), y = max(c(tempdat_big$logYield, tempdat$logYield), na.rm = TRUE), label = "Flathead River", hjust = 0, vjust = 1) +
scale_x_date(expand = c(0.02,0.02)) + #scale_y_continuous(expand = c(0,0)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
<- annotate_figure(egg::ggarrange(pwb1_nlg, pfl1_nlg, ncol = 1), left = "log(Yield, mm/day)")
p print(p)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_timeseries_WBFlat_nolittle.jpg", width = 8, height = 5, units = "in", res = 1000)
pdev.off()
png
2
Summer log(yield) distributions for West Brook and Flathead
<- egg::ggarrange(portfolioplot(bas = "West Brook", orderr = wborder, type = "interannual", wtryrs = c(2020:2024)) + theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), plot.margin = margin(t = 1, r = 1, b = 2, l = 1)),
p portfolioplot(bas = "Flathead", orderr = flatorder, type = "interannual", wtryrs = c(2018:2024)) + theme(axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), plot.margin = margin(t = 1, r = 1, b = 2, l = 1)),
nrow = 2)
print(p)
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summerdensity_WBFlat.jpg", width = 2.75, height = 5, units = "in", res = 1000)
pdev.off()
png
2
<- "Snake River"
bas <- snakeorder
orderr <- c(2022)
wtryrs
<- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Watersheds/Snake_Watersheds.shp")
mysheds <- mysheds[mysheds$site_id == "SP11",]
mysheds <- vect("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Watershed Delineation/Streams/Snake_Streams.shp")
mynet crs(mynet) <- crs(mysheds)
<- crop(mynet, mysheds)
mynet
# get lakes
<- get_waterbodies(AOI = siteinfo_sp %>% filter(site_name == "Spread Creek Dam"), buffer = 100000)
lakes <- st_transform(lakes, crs(mysheds))
lakes <- st_intersection(lakes, st_as_sf(mysheds))
lakes <- lakes %>% filter(gnis_name %in% c("Leidy Lake"))
lakes
# points
<- siteinfo_sp %>% filter(site_name %in% snakeorder) %>% mutate(site_name = factor(site_name, levels = snakeorder))
mylittleg # edit geometry to reduce overlap
st_geometry(mylittleg)[mylittleg$site_name == "SF Spread Creek Lower NWIS"] <- st_point(c(-110.32226, 43.76118))
st_geometry(mylittleg)[mylittleg$site_name == "NF Spread Creek Lower"] <- st_point(c(-110.3199, 43.766533))
st_geometry(mylittleg)[mylittleg$site_name == "Grizzly Creek"] <- st_point(c(-110.23289, 43.77433))
st_geometry(mylittleg)[mylittleg$site_name == "NF Spread Creek Upper"] <- st_point(c(-110.23405, 43.77227))
st_geometry(mylittleg)[mylittleg$site_name == "SF Spread Creek Upper"] <- st_point(c(-110.31475, 43.73661))
# filter data
<- dat_clean %>%
tempdat filter(basin == bas, !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = orderr))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == bas, !is.na(logYield), Month %in% c(7:9), WaterYear %in% unique(tempdat$WaterYear))
tempdat_big
# calculate variability for reference gage
<- tempdat_big %>%
varbig group_by(WaterYear) %>%
summarize(bigrange = range(logYield)[2]-range(logYield)[1],
bigsd = sd(logYield),
bigvar = var(logYield)) %>%
ungroup()
# calculate total summer water availability from reference gage
#summerflow <- tempdat_big %>% group_by(WaterYear) %>% summarize(summeryield = sum(Yield_mm), summeryield_log = log(sum(Yield_mm))) %>% ungroup()
#wateravail2 <- wateravail %>% select(basin, WaterYear, totalyield, totalyield_z)
# calculate relative variation
<- tempdat %>%
pedat group_by(basin, WaterYear) %>%
summarize(nsites = length(unique(site_name)),
littlerange = range(logYield)[2]-range(logYield)[1],
littlesd = sd(logYield),
littlevar = var(logYield)) %>%
ungroup() %>%
left_join(varbig) %>%
mutate(pe_range = ((littlerange-bigrange)/bigrange),
pe_sd = ((littlesd-bigsd)/bigsd),
pe_var = ((littlevar-bigvar)/bigvar)) %>%
left_join(wateravail %>% select(basin, WaterYear, totalyield, totalyield_z, totalyield_sum, totalyield_sum_z, tyz_perc, tyz_sum_perc)) %>%
filter(WaterYear %in% wtryrs) %>%
mutate(wylab = substr(WaterYear, 3, 4)) %>%
arrange(totalyield_sum_z)
# calculate annual median summer flow
<- tempdat %>%
annmed #filter(WaterYear %in% c(lowyr, highyr)) %>%
group_by(site_name, WaterYear) %>%
summarize(medlogYield = median(logYield, na.rm = TRUE)) %>%
ungroup()
# arrange years by total annual yield
<- as.numeric(unlist(pedat %>% select(WaterYear)))
wtryrs_arranged
# plot it
<- list()
plotlist_sn for(i in 1:length(wtryrs_arranged)) {
<- siteinfo_sp %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i]))
mylittleg <- sheds %>% filter(site_name %in% orderr) %>% left_join(annmed %>% filter(WaterYear == wtryrs_arranged[i])) %>% arrange(desc(area_sqmi))
mylittleg_sheds <- local({
plotlist_sn[[i]] <- i
i ggplot() +
geom_sf(data = st_as_sf(mysheds), color = "black", fill = "white", linewidth = 0.4) +
geom_sf(data = mylittleg_sheds, aes(fill = medlogYield), color = "black") +
scale_fill_viridis(option = "A", direction = 1, limits = range(annmed$medlogYield), na.value = "grey") +
geom_sf(data = st_as_sf(mynet), color = "white", linewidth = 1, lineend = "round") +
geom_sf(data = st_as_sf(mynet), color = "royalblue4", linewidth = 0.6, lineend = "round") +
geom_sf(data = mylittleg, shape = 21, fill = "white", size = 2) +
labs(fill = "Median\nsummer\nlog(Yield)") + #annotation_scale() +
coord_sf(xlim = range(st_coordinates(mylittleg_sheds)[,1]), ylim = range(st_coordinates(mylittleg_sheds)[,2])) +
theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "none", axis.text = element_blank()) +
theme_void() + scale_x_continuous(expand = c(0.003, 0.003)) + scale_y_continuous(expand = c(0.002, 0.002))
# annotate("label", x = -Inf, y = -Inf, label = paste(pedat$WaterYear[i], " (", pedat$tyz_sum_perc[i], "%)", sep = ""), vjust = -0.15, hjust = -0.05, size = 5)
})
}
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/Presentation figs/EcoD_summermedianmap_Snake2021.jpg", width = 4, height = 3, units = "in", res = 1000)
ggarrange(plotlist = plotlist_sn, common.legend = TRUE, legend = "right")
dev.off()
png
2
For each basin, use ridgeline plots to show distribution of daily flow values and monthly means by month, year, and site.
<- function(bas, orderr) {
myridgesfun <- length(orderr)
nsites # daily data
<- dat_clean %>% filter(basin == bas) %>%
td mutate(MonthName = factor(MonthName, levels = rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))),
CalendarYear = factor(CalendarYear))
# summarize by month
<- td %>%
td2 group_by(subbasin, site_name, designation, CalendarYear, Month, MonthName) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
mutate(MonthName = factor(MonthName, levels = rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))),
CalendarYear = factor(CalendarYear))
# big g data
<- dat_clean_big %>%
tempdat_big filter(basin == bas, date >= min(td$date), date <= max(td$date)) %>%
group_by(site_name, CalendarYear, Month, MonthName) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
mutate(MonthName = factor(MonthName, levels = rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))),
CalendarYear = factor(CalendarYear))
return(ggplot(data = td2) +
geom_density_ridges(data = td, aes(x = logYield, y = MonthName), alpha = 0.5) +
geom_line(data = td2, aes(x = logYield, y = MonthName, group = site_name, color = factor(site_name, levels = orderr)), orientation = "y", alpha = 0.4) +
geom_point(data = td2, aes(x = logYield, y = MonthName, group = site_name, color = factor(site_name, levels = orderr)), alpha = 0.4) +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
geom_line(data = tempdat_big, aes(x = logYield, y = MonthName, group = site_name), orientation = "y", alpha = 0.5) +
geom_point(data = tempdat_big, aes(x = logYield, y = MonthName, group = site_name), alpha = 0.5) +
theme_bw() + theme(legend.position = "none", panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
facet_wrap2(~CalendarYear, nrow = 3, ncol = 3, trim_blank = FALSE) +
xlab("log(Yield, mm/day)") + ylab(""))
}
myridgesfun(bas = "West Brook", orderr = wborder)
myridgesfun(bas = "Paine Run", orderr = paineorder)
myridgesfun(bas = "Staunton River", orderr = stauntorder)
myridgesfun(bas = "Flathead", orderr = flatorder)
myridgesfun(bas = "Shields River", orderr = yellorder)
myridgesfun(bas = "Snake River", orderr = snakeorder)
myridgesfun(bas = "Donner Blitzen", orderr = donnerorder)
How repeatable is monthly mean flow among sites within basins? I.e., sites with higher than average yield always higher than average, or do lines cross frequently?
Calculate reputability (R) using the rptR package (Stoffel et al. 2017). Also see related papers by Nakagawa and Schielzeth. Repeatibility is calculated on mean monthly flow z-scored by month and year, which removes the effect of monthly and interannual variation in water availability. Results are very similar to models fit using raw yield data with big G flow as a fixed effect.
Generally, repeatibility appears to be greater for snowmelt-dominated basins, particularly in the summer. The “all data” plot is more difficult to interpret as we mostly have seasonal data in the snowmelt basins, particularly the Yellowstone and Snake. In actuality, I would expect the opposite pattern if we had complete time series data for all basins: low reputability for snowmelt basins and high repeatability for rainfall basins (for the same reasons as bow tie vs. wedge).
<- rpttib %>%
rp1 filter(basin != "Donner Blitzen", type == "zscore") %>%
mutate(basin = ifelse(basin == "Paine Run", "Paine",
ifelse(basin == "Staunton River", "Staunton",
ifelse(basin == "Snake River", "Snake",
ifelse(basin == "Shields River", "Yellowstone", basin))))) %>%
ggplot(aes(x = rboot, y = factor(basin, levels = rev(c("West Brook", "Staunton", "Paine", "Flathead", "Yellowstone", "Snake"))))) +
geom_density_ridges(quantile_lines = TRUE, quantiles = 2) +
xlim(0,1) +
theme_bw() + theme(legend.position = "none", panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
xlab("Bootstrapped repeatability (R)") + ylab("Basin") + ggtitle("All data") +
geom_text(data = rpttib %>% filter(basin != "Donner Blitzen", type == "zscore") %>%
mutate(basin = ifelse(basin == "Paine Run", "Paine",
ifelse(basin == "Staunton River", "Staunton",
ifelse(basin == "Snake River", "Snake",
ifelse(basin == "Shields River", "Yellowstone", basin)))))%>% group_by(basin) %>% summarise(rboot = median(rboot)),
aes(label = round(rboot, digits = 2)), position = position_nudge(y = -0.1), colour = "red", size=3.5)
<- rpttib_summer %>%
rp2 filter(basin != "Donner Blitzen", type == "zscore") %>%
mutate(basin = ifelse(basin == "Paine Run", "Paine",
ifelse(basin == "Staunton River", "Staunton",
ifelse(basin == "Snake River", "Snake",
ifelse(basin == "Shields River", "Yellowstone", basin))))) %>%
mutate(basin = factor(basin, levels = rev(c("West Brook", "Staunton", "Paine", "Flathead", "Yellowstone", "Snake")))) %>%
ggplot(aes(x = rboot, y = basin)) +
geom_density_ridges(quantile_lines = TRUE, quantiles = 2) +
# scale_fill_manual(values = rev(brewer.pal(6, "Set2"))) +
xlim(0,1) +
theme_bw() + theme(legend.position = "none", panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
xlab("Bootstrapped repeatability (R)") + ylab("Basin") + ggtitle("Summer only (JAS)") +
geom_text(data = rpttib_summer %>% filter(basin != "Donner Blitzen", type == "zscore") %>%
mutate(basin = ifelse(basin == "Paine Run", "Paine",
ifelse(basin == "Staunton River", "Staunton",
ifelse(basin == "Snake River", "Snake",
ifelse(basin == "Shields River", "Yellowstone", basin)))))%>% group_by(basin) %>% summarise(rboot = median(rboot)),
aes(label = round(rboot, digits = 2)), position = position_nudge(y = -0.1), colour = "red", size=3.5)
rp1
rp2
Write summer repeatability figure to file
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/MeanMonthlyFlow_SummerRepeatability.jpg", width = 4, height = 3.5, units = "in", res = 1000)
%>%
rpttib_summer filter(basin != "Donner Blitzen", type == "zscore") %>%
mutate(basin = ifelse(basin == "Paine Run", "Paine",
ifelse(basin == "Staunton River", "Staunton",
ifelse(basin == "Snake River", "Snake",
ifelse(basin == "Shields River", "Yellowstone", basin))))) %>%
mutate(basin = factor(basin, levels = rev(c("West Brook", "Staunton", "Paine", "Flathead", "Yellowstone", "Snake")))) %>%
ggplot(aes(x = rboot, y = basin)) +
geom_density_ridges(quantile_lines = TRUE, quantiles = 2, aes(fill = basin)) +
scale_fill_manual(values = rev(brewer.pal(6, "Set2"))) +
xlim(0,1) +
theme_bw() + theme(legend.position = "none", panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text = element_text(color = "black")) +
xlab("Bootstrapped repeatability (R)") + ylab("Basin") + #ggtitle("Summer only (JAS)") +
geom_text(data = rpttib_summer %>% filter(basin != "Donner Blitzen", type == "zscore") %>%
mutate(basin = ifelse(basin == "Paine Run", "Paine",
ifelse(basin == "Staunton River", "Staunton",
ifelse(basin == "Snake River", "Snake",
ifelse(basin == "Shields River", "Yellowstone", basin)))))%>% group_by(basin) %>% summarise(rboot = median(rboot)),
aes(label = round(rboot, digits = 2)), position = position_nudge(y = -0.15), colour = "black", size=3.5)
dev.off()
png
2
<- function(bas, orderr, calyr) {
myridgesfun2 <- length(orderr)
nsites # daily data
<- dat_clean %>% filter(basin == bas, CalendarYear == calyr) %>%
td mutate(MonthName = factor(MonthName, levels = rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))),
CalendarYear = factor(CalendarYear))
# summarize by month
<- td %>%
td2 group_by(subbasin, site_name, designation, CalendarYear, Month, MonthName) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
mutate(MonthName = factor(MonthName, levels = rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))),
CalendarYear = factor(CalendarYear))
# big g data
<- dat_clean_big %>%
tempdat_big filter(basin == bas, date >= min(td$date), date <= max(td$date)) %>%
group_by(site_name, CalendarYear, Month, MonthName) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
mutate(MonthName = factor(MonthName, levels = rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))),
CalendarYear = factor(CalendarYear))
return(ggplot(data = td2) +
geom_density_ridges(data = td, aes(x = logYield, y = MonthName), alpha = 0.5) +
geom_line(data = td2, aes(x = logYield, y = MonthName, group = site_name, color = factor(site_name, levels = orderr)), orientation = "y", alpha = 0.8) +
geom_point(data = td2, aes(x = logYield, y = MonthName, group = site_name, color = factor(site_name, levels = orderr)), alpha = 0.8) +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
geom_line(data = tempdat_big, aes(x = logYield, y = MonthName, group = site_name), orientation = "y", alpha = 0.5) +
geom_point(data = tempdat_big, aes(x = logYield, y = MonthName, group = site_name), alpha = 0.5) +
theme_bw() + theme(legend.position = "none", panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.title = element_blank(), axis.text = element_blank(), plot.title = element_text(size = 11)) +
xlim(-2.5,2)
#facet_wrap2(~CalendarYear, nrow = 3, ncol = 3, trim_blank = FALSE) +
#xlab("log(Yield, mm/day)") + ylab("")
) }
# arranged
ggarrange(p1, p2, ncol = 2, widths = c(1,0.7))
Summer exceedance curves and spatial variability in flow relative to (bootstrapped) temporal variability
### WEST BROOK
<- dat_clean %>%
tempdat filter(basin == "West Brook", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = wborder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "West Brook", date >= date("2020-01-01"), date <= date("2025-01-03"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
ewb1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = wborder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "The West Brook", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vwb1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### PAINE RUN
<- dat_clean %>%
tempdat filter(basin == "Paine Run", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = paineorder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Paine Run", date >= as_date("2018-11-07"), date <= as_date("2023-05-15"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
epa1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = paineorder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "Paine Run", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vpa1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### STAUNTON RIVER
<- dat_clean %>%
tempdat filter(basin == "Staunton River", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = stauntorder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Staunton River", date >= as_date("2018-11-07"), date <= as_date("2022-10-19"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
est1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = stauntorder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "Staunton River", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vst1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### FLATHEAD
<- dat_clean %>%
tempdat filter(basin == "Flathead", date >= date("2017-07-29"), date <= date("2023-12-11"), !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = flatorder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Flathead", date >= date("2017-07-29"), date <= date("2023-12-11"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
efl1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = flatorder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "Flathead River", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vfl1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### YELLOWSTONE
<- dat_clean %>%
tempdat filter(basin == "Shields River", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = yellorder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Shields River", date >= date("2015-04-01"), date <= date("2023-12-31"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
eye1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = yellorder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "Yellowstone River", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vye1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### SNAKE
<- dat_clean %>%
tempdat filter(basin == "Snake River", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = snakeorder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Snake River", date >= date("2016-04-01"), date <= date("2023-10-03"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
esn1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = snakeorder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "Snake River", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vsn1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
### DONNER BLITZEN
<- dat_clean %>%
tempdat filter(basin == "Donner Blitzen", !is.na(logYield), Month %in% c(7:9)) %>%
mutate(site_name = factor(site_name, levels = donnerorder))
<- length(unique(tempdat$site_name))
nsites <- dat_clean_big %>% filter(basin == "Donner Blitzen", date >= date("2019-06-01"), date <= as_date("2022-12-31"))
tempdat_big # exceedance
<- tempdat %>%
exceed_little group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup()
<- tempdat_big %>%
exceed_big arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield))
# plot
<- ggplot() +
edb1 geom_line(data = exceed_little, aes(x = exceedance, y = logYield, color = factor(site_name, levels = donnerorder))) +
geom_line(data = exceed_big, aes(x = exceedance, y = logYield), color = "grey40") +
scale_color_manual(values = cet_pal(nsites, name = "i1")) +
#annotate("text", x = max(c(exceed_big$exceedance, exceed_little$exceedance), na.rm = TRUE), y = max(c(exceed_big$logYield, exceed_little$logYield), na.rm = TRUE), label = "Donner und Blitzen River", hjust = 1, vjust = 1) +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
# summarize
<- exceed_little %>%
exceed_little_sd mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(site_name, exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
group_by(exceedance) %>%
summarize(sdyield = sd(logYield)) %>%
ungroup()
<- exceed_big %>%
exceed_big_sum mutate(exceedance = round(exceedance, digits = 0)) %>%
group_by(exceedance) %>%
summarize(logYield = mean(logYield)) %>%
ungroup() %>%
filter(!is.na(logYield))
# bootstrap
<- 1000
nreps <- c()
randsampsd for (i in 1:nreps) { randsampsd[i] <- sd(sample(exceed_big_sum$logYield, size = nsites, replace = FALSE)) }
<- do.call("rbind", replicate(nreps, exceed_little_sd, simplify = FALSE))
exceed_little_sd_exp <- exceed_little_sd_exp %>%
exceed_little_sd_exp mutate(sdbigtemp = rep(randsampsd, each = nrow(exceed_little_sd)),
replicate = rep(c(1:nreps), each = nrow(exceed_little_sd)),
reldiff = ((sdyield-sdbigtemp)/sdbigtemp)*100)
<- exceed_little_sd_exp %>%
exceed_little_sd_exp_sum group_by(exceedance) %>%
summarize(q025 = quantile(reldiff, probs = 0.025),
q10 = quantile(reldiff, probs = 0.10),
q50 = quantile(reldiff, probs = 0.5),
q90 = quantile(reldiff, probs = 0.90),
q975 = quantile(reldiff, probs = 0.975))
# plot
<- exceed_little_sd_exp_sum %>%
vdb1 ggplot() +
geom_ribbon(aes(x = exceedance, ymin = q025, ymax = q975), fill = "grey85") +
geom_ribbon(aes(x = exceedance, ymin = q10, ymax = q90), fill = "grey70") +
geom_line(aes(x = exceedance, y = q50), color = "black", size = 1) +
geom_abline(intercept = 0, slope = 0, linetype = "dashed") +
scale_x_continuous(expand = c(0.02,0.02)) + scale_y_continuous(expand = c(0.02,0.02)) +
theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none",
axis.title = element_blank(), plot.margin = margin(t = 1, r = 5, b = 2, l = 2), axis.text = element_text(color = "black"))
Generate plot
annotate_figure(ggarrange(annotate_figure(egg::ggarrange(ewb1, epa1, est1, efl1, eye1, esn1, edb1, ncol = 1), left = "log(Yield, mm/day)"),
annotate_figure(egg::ggarrange(vwb1, vpa1, vst1, vfl1, vye1, vsn1, vdb1, ncol = 1), left = "Relative spatial variation in flow (%)"),
ncol = 2), bottom = "Exceedance probability")
Write to file
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/EcoD_exceedance_new.jpg", width = 5.5, height = 11, units = "in", res = 1000)
annotate_figure(ggarrange(annotate_figure(egg::ggarrange(ewb1, epa1, est1, efl1, eye1, esn1, edb1, ncol = 1), left = "log(Yield, mm/day)"),
annotate_figure(egg::ggarrange(vwb1, vpa1, vst1, vfl1, vye1, vsn1, vdb1, ncol = 1), left = "Relative spatial variation in flow (%)"),
ncol = 2), bottom = "Exceedance probability")
dev.off()
png
2
<- ggarrange(annotate_figure(egg::ggarrange(pwb1, ppa1, pst1, pfl1, pye1, psn1, pdb1, ncol = 1),
p bottom = text_grob("Date\n ", size = 11), left = text_grob("log(Yield, mm/day)", size = 11, rot = 90)),
annotate_figure(egg::ggarrange(ewb1, epa1, est1, efl1, eye1, esn1, edb1, ncol = 1),
bottom = text_grob("Exceedance probability \n(summer only)", size = 11)),
ncol = 2, widths = c(1,0.4))
p
Write to file
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/EcoD_tsexed_new.jpg", width = 8, height = 11, units = "in", res = 1000)
pdev.off()
png
2
Use rose/radial plots to show differences in key flow metrics among sites within the West Brook. While these metrics/plots provide helpful summaries of flow regimes and variation among sites, extending to other regions/basins is not possible given the extent of seasonal/missing data.
Calculate flow metrics for each site:
Generate plot
Use CVPE (mean-variance Portfolio Effect, Anderson et al. 2013) to explore the effect site-level heterogeneity in flow regimes on network
Plotting function
# set up color palette
<- c(brewer.pal(8, "Dark2"), "dodgerblue", "darkorchid")
mycols
# create plotting function
<- function(subbas, lab, bigG) {
myplotfun <- dat_clean %>% filter(subbasin == subbas)
data_sub par(mar = c(1.7,1.7,0.1,0.1), mgp = c(2.5,0.6,0))
plot(logYield ~ date, data_sub, type = "n", xlab = "", ylab = "")
#tempdat_little <- data_sub %>% filter(designation == "little")
<- fill_missing_dates(data_sub, dates = date, groups = site_name, pad_ends = FALSE)
tempdat_little <- dat_clean_big %>% filter(site_name == bigG, date >= min(tempdat_little$date), date <= max(tempdat_little$date))
tempdat_big #tempdat_big <- data_sub %>% filter(designation == "big")
<- fill_missing_dates(tempdat_big, dates = date, groups = site_name, pad_ends = FALSE)
tempdat_big <- sort(unique(tempdat_little$site_name))
mysites for (i in 1:length(mysites)) {
lines(logYield ~ date, tempdat_little %>% filter(site_name == mysites[i]), col = mycols[i], lwd = 0.7)
}lines(logYield ~ date, tempdat_big, col = "white", lwd = 1.7)
lines(logYield ~ date, tempdat_big, col = "black", lwd = 1)
<- par("usr")
usr par(usr = c(0,1,0,1))
text(0.02, 0.9, labels = lab, cex = 1.2)
par(usr = usr)
}
Generate plot
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/EcoD_timeseries.jpg", width = 8, height = 12, units = "in", res = 1000)
par(mfrow = c(10,1), oma = c(0.5,2,0.5,0.5))
# West Brook
myplotfun(subbas = "West Brook", lab = "(a)", bigG = "South River Conway NWIS")
# Paine
myplotfun(subbas = "Paine Run", lab = "(b)", bigG = "South River Harriston NWIS")
# Staunton River
myplotfun(subbas = "Staunton River", lab = "(c)", bigG = "Rapidan River NWIS")
# Big Creek
myplotfun(subbas = "Big Creek", lab = "(d)", bigG = "North Fork Flathead River NWIS")
# Coal Creek
myplotfun(subbas = "Coal Creek", lab = "(e)", bigG = "North Fork Flathead River NWIS")
# McGee Creek
myplotfun(subbas = "McGee Creek", lab = "(f)", bigG = "North Fork Flathead River NWIS")
# Snake River
myplotfun(subbas = "Snake River", lab = "(g)", bigG = "Pacific Creek at Moran NWIS")
# Shields River
myplotfun(subbas = "Shields River", lab = "(h)", bigG = "Yellowstone River Livingston NWIS")
# Duck Creek
myplotfun(subbas = "Duck Creek", lab = "(i)", bigG = "Yellowstone River Livingston NWIS")
# Donner Blitzen
myplotfun(subbas = "Donner Blitzen", lab = "(j)", bigG = "Donner Blitzen River nr Frenchglen NWIS")
# common axis label
mtext("log(Daily yield, mm)", outer = TRUE, side = 2, line = 0.5)
dev.off()
Plotting functions
# create plotting function
<- function(subbas, lab) {
myplotfun_ex # filter to subbasin and get site designation
}
# CV of little g Yield by exceedance probability
<- function(subbas, lab) {
myplotfun_cv # filter to subbasin and get site designation
<- dat_clean %>% filter(subbasin == subbas)
data_sub <- data_sub %>% group_by(site_name) %>% summarize(designation = unique(designation)) %>% ungroup()
sitesdesig # calculate exceedance probability by site
<- data_sub %>%
exeeddat select(date, site_name, logYield) %>%
spread(key = site_name, value = logYield) %>%
drop_na() %>%
gather(key = site_name, value = logYield, 2:ncol(.)) %>%
group_by(site_name) %>%
arrange(desc(logYield), .by_group = TRUE) %>%
mutate(exceedance = 100/length(logYield)*1:length(logYield)) %>%
ungroup() %>%
left_join(sitesdesig)
<- exeeddat %>% filter(designation == "little")
exeeddat_little <- exeeddat %>% filter(designation == "big")
exeeddat_big # set up plot
par(mar = c(1.7,1.7,0.1,0.1), mgp = c(2.5,0.6,0))
<- sort(unique(exeeddat_little$site_name))
mysites <- list()
tiblist for (i in 1:length(mysites)) {
<- exeeddat %>% filter(site_name == mysites[i])
tt <- approx(x = tt$exceedance, y = tt$logYield, xout = seq(from = 0, to = 100, by = 1))
mylinint <- tibble(site_name = mysites[i], exceedance = mylinint$x, logYield = mylinint$y)
tiblist[[i]]
}<- do.call(bind_rows, tiblist) %>%
cvtib group_by(exceedance) %>%
summarize(sdf = sd(logYield)) %>%
ungroup()
plot(sdf ~ exceedance, cvtib, type = "l", col = "grey40", lwd = 2, ylim = c(0,0.8))
# panel label
<- par("usr")
usr par(usr = c(0,1,0,1))
text(0.92, 0.9, labels = lab, cex = 1.2)
par(usr = usr)
}
Plot exceedance
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/EcoD_exceedance_JAS.jpg", width = 4, height = 8, units = "in", res = 1000)
par(mfrow = c(5,2), oma = c(2,2,0.5,0.5))
myplotfun_ex(subbas = "West Brook", lab = "(a)")
myplotfun_ex(subbas = "Paine Run", lab = "(b)")
myplotfun_ex(subbas = "Staunton River", lab = "(c)")
myplotfun_ex(subbas = "Big Creek", lab = "(d)")
myplotfun_ex(subbas = "Coal Creek", lab = "(e)")
myplotfun_ex(subbas = "McGee Creek", lab = "(f)")
myplotfun_ex(subbas = "Snake River", lab = "(g)")
myplotfun_ex(subbas = "Shields River", lab = "(h)")
myplotfun_ex(subbas = "Duck Creek", lab = "(i)")
myplotfun_ex(subbas = "Donner Blitzen", lab = "(j)")
mtext("log(Daily yield, mm)", outer = TRUE, side = 2, line = 0.5)
mtext("Exceedance probability", outer = TRUE, side = 1, line = 0.5)
dev.off()
#
Plot CV by exceedance
jpeg("C:/Users/jbaldock/OneDrive - DOI/Documents/USGS/EcoDrought/EcoDrought Working/EcoDrought-Analysis/Qualitative/EcoD_exceedance_cv.jpg", width = 4, height = 8, units = "in", res = 1000)
par(mfrow = c(5,2), oma = c(2,2,0.5,0.5))
myplotfun_cv(subbas = "West Brook", lab = "(a)")
myplotfun_cv(subbas = "Paine Run", lab = "(b)")
myplotfun_cv(subbas = "Staunton River", lab = "(c)")
myplotfun_cv(subbas = "Big Creek", lab = "(d)")
myplotfun_cv(subbas = "Coal Creek", lab = "(e)")
myplotfun_cv(subbas = "McGee Creek", lab = "(f)")
myplotfun_cv(subbas = "Snake River", lab = "(g)")
myplotfun_cv(subbas = "Shields River", lab = "(h)")
myplotfun_cv(subbas = "Duck Creek", lab = "(i)")
myplotfun_cv(subbas = "Donner Blitzen", lab = "(j)")
mtext("SD of log(daily yield, mm) at little g's", outer = TRUE, side = 2, line = 0.5)
mtext("Exceedance probability", outer = TRUE, side = 1, line = 0.5)
dev.off()
#