I have some column charts split into pages and facets that all have the x-axis starting at 13. I'd like to make it such that for each facet if the min_temp value is greater than cold_max, then I start the x-axis at 16 instead. I have included my code and the link to my data.
library(tidyverse)
library(ggforce)
summer_avg_longterm = read_csv("summer_avg_longterm.csv")
cold_max = 18.29
warm_min = 21.70
summer_avg_longterm = summer_avg_all %>%
group_by(staSeq) %>%
filter(n_distinct(year) >= 10) %>%
ungroup()
summer_avg_longterm = summer_avg_longterm %>%
mutate(
year_group_start = floor(year / 5) * 5,
year_group_end = year_group_start + 4,
year_group = paste0(year_group_start, "-", year_group_end)
)
summer_5yr_summary = summer_avg_longterm %>%
group_by(staSeq, WaterbodyName, year_group) %>%
summarise(
mean_temp = mean(avg_temp, na.rm = TRUE),
median_temp = median(avg_temp, na.rm = TRUE),
n_years = n(),
.groups = "drop"
)
summer_5yr_summary = summer_5yr_summary %>%
mutate(facet_label = paste(staSeq, "-", WaterbodyName))
n_per_page = 9
n_sites = length(unique(summer_5yr_summary$staSeq))
n_pages = ceiling(n_sites / n_per_page)
site_ranges = summer_5yr_summary %>%
group_by(staSeq, WaterbodyName, facet_label) %>%
summarise(
min_temp = min(median_temp, na.rm = TRUE),
max_temp = max(median_temp, na.rm = TRUE),
.groups = "drop"
)
cold_lines = site_ranges %>%
mutate(
yintercept = cold_max,
color = "mediumturquoise",
line_type = "Cold threshold"
)
warm_lines = site_ranges %>%
filter(max_temp > warm_min) %>%
mutate(
yintercept = warm_min,
color = "indianred1",
line_type = "Warm threshold"
)
site_lines = bind_rows(cold_lines, warm_lines)
summer_5yr_summary = summer_5yr_summary %>%
left_join(site_ranges, by = c("staSeq", "WaterbodyName", "facet_label")) %>%
mutate(
y_min = ifelse(min_temp > cold_max, 16, 13)
)
for (i in 1:n_pages) {
p = ggplot(summer_5yr_summary, aes(x = year_group, y = median_temp)) +
geom_hline(
data = site_lines,
aes(yintercept = yintercept),
color = site_lines$color,
linetype = "solid",
size = 1,
show.legend = FALSE
) +
geom_col(fill = "gray70") +
geom_text(
aes(label = paste0("n = ", n_years), y = median_temp + 0.5),
vjust = 0.3,
size = 3.5
) +
facet_wrap_paginate(~ facet_label, scales = "free_y", ncol = 3, nrow = 3, page = i) +
labs(
title = paste(
"5-Year Median Summer Water Temperatures by Site (Page",
i, "of", n_pages, ")"
),
x = "5-Year Period",
y = "Median Summer Temperature (°C)"
) +
scale_y_continuous(limits = c(13.5, NA), oob = rescale_none) +
theme_minimal(base_size = 13) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
strip.text = element_text(face = "bold"),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank()
)
print(p)
}