library(tidyverse)
library(lubridate)
library(lme4)
library(lmerTest)
library(lutz)
library(maps)
library(grid)
library(emmeans)Time Zone Travel Is Associated With Reductions In Competitive Powerlifting Performance In U.S. Adults
Abstract
Introduction
Sleep loss and circadian misalignment—such as that caused by time zone travel—impair neuromuscular performance and power output in laboratory settings. However, limited evidence exists on whether these effects impair real-world performance in strength competitions.
Purpose
To determine whether the number and direction of time zones crossed before competition predicts changes in powerlifting performance versus a lifter’s prior meet.
Methods
Public meet results were obtained from the OpenPowerlifting database. Inclusion criteria: U.S. men and women (24-64 y), raw USAPL/USPA squat-bench-deadlift (SBD) events held in the U.S., valid attempts in all three lifts, and ≥2 meets within 30-365 days with minimal body mass change (<5 kg). Time zone offsets were determined using lifter home state and meet state. To isolate the effect of travel into a new time zone, only meets where the previous meet occurred in the lifter’s home time zone were included. Performance was defined as total weight lifted (TotalKg), and performance change was calculated within-lifter as ΔTotal = current TotalKg − previous TotalKg. Implausible changes (< −25 kg or > +75 kg) were excluded. A linear mixed-effects model (random intercept for lifter) estimated the effect of time zone travel on ΔTotal, adjusting for sex, age class, body mass, number of meets, and days since prior meet.
Results
17,996 repeat U.S. lifters (44% women) met inclusion criteria. Performance gains were greatest when competing locally (12.8 kg) and were attenuated when crossing time zones, with reductions ranging from ~3-5 kg. Westward travelers crossing two time zones had the largest reduction in performance, with a mean ΔTotal of 7.2 kg.
Conclusion
These findings suggest time zone travel impairs performance in real-world competition conditions. Athletes and coaches should consider arriving earlier to allow sufficient adjustment to the new time zone and optimize sleep and circadian phase prior to competition.
Code
Process
df_raw <- read_csv("../data/openpowerlifting-2026-02-28-ee61a5aa.csv")df_filt <- df_raw |>
mutate(
Date = ymd(Date, quiet = TRUE),
Sex = as.factor(Sex),
Equipment = as.factor(Equipment),
) |>
filter(
!is.na(Age),
!is.na(AgeClass),
!is.na(State),
!is.na(Country),
!is.na(MeetCountry),
!is.na(MeetState),
!is.na(Best3SquatKg),
!is.na(Best3BenchKg),
!is.na(Best3DeadliftKg),
!is.na(Dots),
!is.na(Country),
!is.na(Tested)
) |>
filter(
Country == "USA",
MeetCountry == "USA",
Federation %in% c("USAPL", "USPA"),
State %in% c("Guam", "AK", "HI") == FALSE,
MeetState %in% c("Guam", "AK", "HI") == FALSE,
Best3SquatKg > 0,
Best3DeadliftKg > 0,
Best3BenchKg > 0,
Sex %in% c("M", "F"),
Equipment == "Raw",
AgeClass %in% c(
"24-34",
"35-39",
"40-44",
"45-49",
"50-54",
"55-59",
"60-64"
),
Event == "SBD",
Place != "DQ",
Tested == "Yes",
Sanctioned == "Yes",
year(Date) > 2005,
year(Date) != 2020
)state_timezone <- function(states, dates = Sys.Date()) {
if (length(dates) == 1) {
dates <- rep(dates, length(states))
}
stopifnot(length(states) == length(dates))
# lookup table for 50 states + DC
us_states_tbl <- tibble::tibble(
StateName = c(state.name, "District Of Columbia"),
StateAbb = c(state.abb, "DC"),
lon = c(as.numeric(state.center$x), -77.0369),
lat = c(as.numeric(state.center$y), 38.9072)
)
# check that abbreviations are valid
valid_idx <- states %in% us_states_tbl$StateAbb
if (any(!valid_idx)) {
warning(
"Invalid state abbreviations: ",
paste(unique(states[!valid_idx]), collapse = ", ")
)
}
# filter only valid pairs
states <- states[valid_idx]
dates <- dates[valid_idx]
# compute per-state offset
results <- map2_dfr(states, dates, function(st, dt) {
row <- us_states_tbl[us_states_tbl$StateAbb == st, ]
tz <- lutz::tz_lookup_coords(
lat = row$lat,
lon = row$lon,
method = "fast",
warn = FALSE
)
# compute offset correctly, accounting for time of year
local_noon_UTC <- with_tz(as.POSIXct(paste0(dt, " 12:00:00"), tz = tz), "UTC")
utc_noon <- as.POSIXct(paste0(dt, " 12:00:00"), tz = "UTC")
offset_h <- -as.numeric(difftime(local_noon_UTC, utc_noon, units = "hours"))
return(
tibble(
State = st,
Date = dt,
TimeZone = tz,
UTC_Offset_h = offset_h
)
)
})
return(results)
}# use UTC offsest difference to derive direction of travel
df_tz <- df_filt |>
mutate(
StateTzOffset = state_timezone(State, Date)$UTC_Offset_h,
MeetStateTzOffset = state_timezone(MeetState, Date)$UTC_Offset_h,
StateMeetTzDiff = MeetStateTzOffset - StateTzOffset,
Direction = case_when(
StateMeetTzDiff == 0 ~ "Local",
StateMeetTzDiff > 0 ~ "Eastward",
StateMeetTzDiff < 0 ~ "Westward",
)
) # only keep one record if they competed in multiple divisions at an event
df_single_div <- df_tz |>
arrange(Name, Date, desc(TotalKg), desc(Dots)) |>
distinct(Name, Date, .keep_all = TRUE)# filter to individuals with multiple meets
df_mult_meet <- df_single_div |>
group_by(Name) |>
arrange(Date) |>
mutate(
MeetCount = n(),
MeetNumber = row_number()
) |>
filter(MeetCount >= 2) |>
ungroup()df_lags <- df_mult_meet |>
group_by(Name, State) |>
arrange(Date) |>
mutate(
PrevAgeClass = dplyr::lag(AgeClass),
PrevBodyweightKg = dplyr::lag(BodyweightKg),
PrevDate = dplyr::lag(Date),
PrevDots = dplyr::lag(Dots),
PrevTotal = dplyr::lag(TotalKg),
PrevDeltaTz = dplyr::lag(StateMeetTzDiff),
DaysSinceLast = as.numeric(Date - PrevDate),
DeltaDots = Dots - PrevDots,
DeltaTotal = TotalKg - PrevTotal
) |>
ungroup()
df_lags_filt <- df_lags |>
filter(
!is.na(PrevDate),
between(DaysSinceLast, 30, 365),
PrevDeltaTz == 0,
AgeClass == PrevAgeClass,
abs(BodyweightKg - PrevBodyweightKg) <= 5,
between(MeetNumber, 2, 8),
between(DeltaTotal, -25, 75)
)
df_clean <- df_lags_filt |>
mutate(
cDays = as.numeric(scale(DaysSinceLast)),
StateMeetTzDiff = factor(StateMeetTzDiff),
StateMeetTzDiff = relevel(StateMeetTzDiff, ref = "0")
) |>
arrange(Name, Date)rmarkdown::paged_table(df_clean[1:100, ])print(paste("Number of observations:", nrow(df_clean)))[1] "Number of observations: 33038"
table(df_clean$Sex)
F M Mx
15063 17975 0
print(paste("Number of unique lifters:", n_distinct(df_clean$Name)))[1] "Number of unique lifters: 17996"
df_clean |>
group_by(Name) |>
summarise(
count = n(),
sex = Sex[1]
) |>
group_by(sex) |>
count() |>
ungroup() |>
mutate(prop = n / sum(n))# A tibble: 2 × 3
sex n prop
<fct> <int> <dbl>
1 F 7929 0.441
2 M 10067 0.559
Visualization
plot_theme <- function() {
theme(
strip.background = element_rect(
fill = "black",
colour = "gray50",
linewidth = 1.5
),
strip.text = element_text(face = "bold", color = "gray90"),
plot.background = element_rect(fill = "black", color = NA),
panel.background = element_rect(fill = "black", color = NA),
text = element_text(size = 18, color = "gray90"),
axis.text = element_text(color = "gray90"),
legend.title = element_text(face = "bold"),
legend.text = element_text(face = "bold"),
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.line = element_line(linewidth = 0.8, color = "gray50"),
panel.grid.minor = element_blank(),
legend.position = c(0.53, .20),
legend.direction = "horizontal",
legend.box.background = element_rect(fill = "black", color = "gray90"),
panel.grid.major.x = element_blank()
)
}# weight lifted
(p_weightlifted <- df_clean |>
mutate(
Sex = forcats::fct_drop(Sex),
Sex = ifelse(Sex == "F", "Females", "Males"),
Sex = fct_rev(factor(Sex))
) |>
select(
Sex,
TotalKg,
Best3SquatKg,
Best3BenchKg,
Best3DeadliftKg
) |>
rename(
Squat = Best3SquatKg,
Bench = Best3BenchKg,
Deadlift = Best3DeadliftKg,
Total = TotalKg
) |>
pivot_longer(cols = -Sex) |>
group_by(Sex, name) |>
summarise(
mean = mean(value, na.rm = TRUE),
sd = sd(value, na.rm = TRUE),
.groups = "drop"
) |>
mutate(name = fct_relevel(name, c("Bench", "Squat", "Deadlift", "Total"))) |>
ggplot(aes(x = Sex, y = mean)) +
geom_col(width = 0.6, colour = "gray90", fill = "gray60", show.legend = FALSE) +
geom_errorbar(
aes(ymin = mean - sd, ymax = mean + sd),
width = 0.2,
colour = "gray90"
) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
facet_wrap(~name, scales = "free", nrow = 1) +
ylab("Weight (kg)") +
theme_classic() +
plot_theme() +
theme(
axis.title.x = element_blank(),
axis.text.y = element_text(size = 12),
axis.text.x = element_text(face = "bold")
))ggsave(
filename = "../figs/p_weightlifted.jpeg",
plot = p_weightlifted,
height = 1000,
width = 3000,
units = "px"
) # time zone count
(p_tz_count <- df_clean |>
mutate(Sex = forcats::fct_drop(Sex)) |>
filter(Direction != "Local") |>
group_by(StateMeetTzDiff, Direction) |>
summarise(count = n(), .groups = "drop") |>
mutate(
Direction = fct_rev(factor(Direction)),
StateMeetTzDiff = as.character(StateMeetTzDiff),
x_plot = case_when(
Direction == "Westward" ~ paste0("W", abs(as.numeric(StateMeetTzDiff))),
TRUE ~ paste0("E", StateMeetTzDiff)
),
x_plot = factor(
x_plot,
levels = c("W3", "W2", "W1", "E1", "E2", "E3")
)
) |>
ggplot(aes(x_plot, count, fill = StateMeetTzDiff)) +
geom_col(show.legend = FALSE, colour = "gray60", linewidth = 0.6) +
facet_wrap(~Direction, scales = "free_x") +
geom_text(
aes(label = count),
vjust = -0.4,
size = 7,
colour = "gray90"
) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
scale_fill_manual(
values = c(
"-3" = "#fa432a",
"-2" = "#fc715d",
"-1" = "#fcab9f",
"1" = "#9fcdfc",
"2" = "#61aeff",
"3" = "#0f84fc"
)
) +
scale_x_discrete(
labels = function(x) gsub("^[WE]", "", x)
) +
theme_classic() +
plot_theme() +
theme(
text = element_text(size = 28, face = "bold"),
strip.background = element_blank(),
strip.text = element_blank(),
axis.line.x = element_line(linewidth = 1),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.line.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
))ggsave(
filename = "../figs/p_tz_count.jpeg",
plot = p_tz_count,
height = 1000,
width = 2800,
units = "px"
) p_obs_per_person <- df_clean |>
group_by(Name) |>
summarise(n_obs = n()) |>
group_by(n_obs) |>
summarise(count = n()) |>
ggplot(aes(n_obs, count)) +
geom_bar(stat = "identity", colour = "gray90", fill = "gray60") +
ylab("Count") +
xlab("Number of observations per person") +
scale_x_continuous(
breaks = 1:7,
labels = as.character(1:7)
) +
theme_classic() +
plot_theme() +
theme(
axis.title.y = element_blank(),
axis.title.x = element_text(size = 20),
axis.text.x = element_text(size = 22),
axis.text.y = element_text(size = 18)
)
p_age_class <- df_clean |>
group_by(AgeClass) |>
summarise(count = n()) |>
ggplot(aes(AgeClass, count)) +
geom_bar(stat = "identity", colour = "gray90", fill = "gray60") +
xlab("Age Class") +
ylab("Count") +
theme_classic() +
plot_theme() +
theme(
axis.title.y = element_blank(),
axis.title.x = element_text(size = 20),
axis.text.x = element_text(size = 22),
axis.text.y = element_text(size = 18)
)
p_meet_number <- df_clean |>
group_by(MeetNumber) |>
summarise(count = n()) |>
ggplot(aes(MeetNumber, count)) +
geom_bar(stat = "identity", colour = "gray90", fill = "gray60") +
ylab("Count") +
xlab("Meet Number") +
scale_x_continuous(
breaks = 2:8,
labels = as.character(2:8)
) +
theme_classic() +
plot_theme() +
theme(
axis.title.y = element_blank(),
axis.title.x = element_text(size = 20),
axis.text.x = element_text(size = 22),
axis.text.y = element_text(size = 18)
)
gridExtra::grid.arrange(
p_obs_per_person,
p_age_class,
p_meet_number
)p_vars <- gridExtra::arrangeGrob(
ncol = 1,
p_age_class,
p_meet_number
)
ggsave(
filename = "../figs/p_vars.jpeg",
plot = p_vars,
height = 2200,
width = 2000,
units = "px"
)# Count people per state
state_counts <- df_clean |>
group_by(MeetState) |>
summarise(n = n()) |>
mutate(state_abbr = MeetState) |>
select(-MeetState)
# Built-in lookup table for state abbreviations -> full names
state_lookup <- data.frame(
state_abbr = state.abb,
region = tolower(state.name)
)
# Join counts to state names
state_counts_map <- state_counts |>
left_join(state_lookup, by = "state_abbr")
# Get US state polygon data
us_map <- map_data("state")
# Join map polygons to your counts
map_df <- us_map |>
left_join(state_counts_map, by = "region")
# Plot
(p_meetstate_count <- map_df |>
ggplot(aes(long, lat, group = group, fill = n)) +
geom_polygon(color = "black", linewidth = 0.2, show.legend = F) +
coord_fixed(1.3) +
scale_fill_gradient(
low = "#a9e6a3",
high = "#15e002",
na.value = "grey95",
name = "Count"
) +
labs(fill = "Count") +
theme_void() +
theme(
panel.background = element_rect(fill = "black", colour = "black"),
plot.background = element_rect(fill = "black", colour = "black"),
plot.margin = margin(0, 0, 0, 0, "pt")
))ggsave(
filename = "../figs/p_meetstate_count.jpeg",
plot = p_meetstate_count,
height = 1600,
width = 2200,
units = "px",
bg = "black"
)walk(c("missouri", "utah", "illinois"), function(x){
p_state <- map_df |>
mutate(is_mo = ifelse(region == x, "1", "0")) |>
ggplot(aes(long, lat, group = group, fill = is_mo)) +
geom_polygon(color = "black", linewidth = 0.2, show.legend = F) +
scale_fill_manual(
values = c(
"0" = "grey70",
"1" = "#15e002"
)
) +
coord_fixed(1.3) +
labs(fill = "Count") +
theme_void()
ggsave(
filename = paste0("../figs/p_", x, ".jpeg"),
plot = p_state,
height = 1600,
width = 2200,
units = "px",
bg = "black"
)
})# count routes
routes <- df_clean |>
filter(MeetState != State) |>
filter(!is.na(State), !is.na(MeetState)) |>
count(State, MeetState, name = "n")
# state center coordinates
centers <- data.frame(
abb = state.abb,
lon = state.center$x,
lat = state.center$y
)
# join origin/destination coordinates + classify direction
routes_map <- routes |>
left_join(centers, by = c("State" = "abb")) |>
rename(lon_from = lon, lat_from = lat) |>
left_join(centers, by = c("MeetState" = "abb")) |>
rename(lon_to = lon, lat_to = lat) |>
filter(
!is.na(lon_from), !is.na(lat_from),
!is.na(lon_to), !is.na(lat_to)
) |>
mutate(
Direction = case_when(
lon_to > lon_from ~ "Eastward",
lon_to < lon_from ~ "Westward",
),
Direction = factor(Direction, levels = c("Westward", "Eastward"))
)
# US map background
us_map <- map_data("state")
(p_travel_map <- ggplot() +
geom_polygon(
data = us_map,
aes(x = long, y = lat, group = group),
fill = "black",
color = "gray40",
linewidth = 0.5
) +
geom_curve(
data = routes_map,
aes(
x = lon_from, y = lat_from,
xend = lon_to, yend = lat_to,
linewidth = n,
color = Direction
),
curvature = 0.2,
alpha = 0.8,
arrow = arrow(length = unit(0.08, "inches")),
show.legend = FALSE
) +
scale_color_manual(
values = c(
"Westward" = "#fc8d7e",
"Eastward" = "#7ebdfc"
)
) +
scale_linewidth(range = c(0.2, 2.5), name = "Count") +
coord_fixed(1.3) +
theme_void() +
theme(
panel.background = element_rect(fill = "black", colour = "black"),
plot.background = element_rect(fill = "black", colour = "black"),
plot.margin = margin(0, 0, 0, 0, "pt")
)) ggsave(
filename = "../figs/p_travel_map.jpeg",
plot = p_travel_map,
height = 1600,
width = 2200,
units = "px",
bg = "black"
)(p_westward_common <- df_clean |>
filter(Direction == "Westward") |>
select(MeetState, State, Direction) |>
group_by(MeetState, State, Direction) |>
count() |>
ungroup() |>
arrange(desc(n)) |>
slice(1:10) |>
mutate(route = paste0(State, " \u2192 ", MeetState)) |>
ggplot(aes(x = n, y = reorder(route, n))) +
geom_col(fill = "#fc8d7e", colour = "gray60") +
labs(x = "Count", y = NULL) +
plot_theme() +
theme(
panel.grid = element_blank(),
axis.text = element_text(size = 16),
axis.title.x = element_text(size = 20)
))ggsave(
filename = "../figs/p_westward_common.jpeg",
plot = p_westward_common,
height = 1800,
width = 1200,
units = "px"
)
(p_eastward_common <- df_clean |>
filter(Direction == "Eastward") |>
select(MeetState, State, Direction) |>
group_by(MeetState, State, Direction) |>
count() |>
ungroup() |>
arrange(desc(n)) |>
slice(1:10) |>
mutate(route = paste0(State, " \u2192 ", MeetState)) |>
ggplot(aes(x = n, y = reorder(route, n))) +
geom_col(fill = "#7ebdfc", colour = "gray60") +
labs(x = "Count", y = NULL) +
plot_theme() +
theme(
panel.grid = element_blank(),
axis.text = element_text(size = 16),
axis.title.x = element_text(size = 20)
))ggsave(
filename = "../figs/p_eastward_common.jpeg",
plot = p_eastward_common,
height = 1800,
width = 1200,
units = "px"
) Modeling
mod <- lmer(
DeltaTotal ~ StateMeetTzDiff*Sex + TotalKg + MeetNumber +
AgeClass + BodyweightKg + cDays + (1 | Name),
data = df_clean
)boundary (singular) fit: see help('isSingular')
mod |>
broom.mixed::tidy(effects = "fixed", conf.int = TRUE) |>
rmarkdown::paged_table()emm <- emmeans(mod, ~ StateMeetTzDiff, pbkrtest.limit = Inf) NOTE: Results may be misleading due to involvement in interactions
emm_df <- as.data.frame(emm)
emm_df <- emm_df |>
mutate(
tz_signed = as.integer(as.character(StateMeetTzDiff)),
Direction = case_when(
tz_signed > 0 ~ "Eastward",
tz_signed < 0 ~ "Westward",
tz_signed == 0 ~ "Local"
),
tz_abs = abs(tz_signed)
)
emm_df |>
mutate(`Time Zone` = case_when(
StateMeetTzDiff == 0 ~ "Local",
StateMeetTzDiff == -3 ~ "Westward, 3",
StateMeetTzDiff == -2 ~ "Westward, 2",
StateMeetTzDiff == -1 ~ "Westward, 1",
StateMeetTzDiff == 3 ~ "Eastward, 3",
StateMeetTzDiff == 2 ~ "Eastward, 2",
StateMeetTzDiff == 1 ~ "Eastward, 1"),
`Time Zone` = as.factor(`Time Zone`),
`Time Zone` = fct_relevel(
`Time Zone`,
c(
"Local",
"Westward, 1",
"Westward, 2",
"Westward, 3",
"Eastward, 1",
"Eastward, 2",
"Eastward, 3"
)
)
) |>
arrange(`Time Zone`) |>
select(`Time Zone`, emmean, lower.CL, upper.CL) |>
map_if(is.numeric, round, 1) |>
bind_cols() |>
rmarkdown::paged_table()# duplicate local tz for plotting
emm_df_dup <- emm_df |>
rbind(filter(emm_df, Direction == "Local")) |>
arrange(as.numeric(tz_abs))
emm_df_dup$Direction[1] <- "Eastward"
emm_df_dup$Direction[2] <- "Westward"
(p_emm_tz_travel <- emm_df_dup |>
mutate(Direction = fct_rev(Direction)) |>
ggplot(aes(
x = tz_abs,
y = emmean,
color = Direction
)) +
geom_hline(
yintercept = emm_df[emm_df$StateMeetTzDiff == 0, ]$emmean,
linetype = 2,
linewidth = 0.8,
colour = "gray80"
) +
geom_line(linewidth = 1.3) +
geom_point(size = 2.5) +
geom_errorbar(
aes(
ymin = lower.CL,
ymax = upper.CL
),
width = 0.3,
linewidth = 1,
alpha = 1
) +
scale_color_manual(values = c("Eastward" = "#9fcdfc", "Westward" = "#fcab9f")) +
scale_x_continuous(breaks = 0:3, labels = c("TZ-0", "TZ-1", "TZ-2", "TZ-3")) +
labs(
y = "ΔTotal (kg)",
color = "Travel Direction"
) +
scale_y_continuous(limits = c(3, 15), breaks = c(5, 10, 15)) +
theme_minimal() +
plot_theme() +
theme(
axis.title.x = element_blank(),
panel.grid.major = element_blank(),
text = element_text(size = 20, color = "gray90"),
axis.text.x = element_text(size = 24, color = "gray90"),
axis.text = element_text(color = "gray90"),
axis.line = element_line(linewidth = 1.2, color = "gray80"),
panel.grid.minor = element_blank(),
legend.position = c(0.55, .95),
legend.direction = "horizontal",
legend.box.background = element_rect(
fill = "black",
color = "gray80",
linewidth = 0.8
)
)
)ggsave(
filename = "../figs/delta_total_by_time_zone.jpg",
plot = p_emm_tz_travel,
height = 1500,
width = 2400,
units = "px"
)place_diff <- df_filt |>
filter(Place %in% as.character(1:11)) |>
mutate(Place = as.numeric(Place)) |>
group_by(Date, MeetName, AgeClass, WeightClassKg, Sex) |>
arrange(Date, MeetName, AgeClass, WeightClassKg, Sex, Place) |>
mutate(
Dots_diff_next = Dots - lead(Dots),
Kg_diff_next = TotalKg - lead(TotalKg),
next_place = lead(Place),
place_diff = next_place - Place,
group_count = n()
) |>
ungroup() |>
filter(place_diff == 1, group_count > 1)
place_summary <- place_diff |>
group_by(Place) |>
summarize(
mean_diff = mean(Kg_diff_next, na.rm = TRUE),
median_diff = median(Kg_diff_next, na.rm = TRUE),
q1 = quantile(Kg_diff_next, 0.25, na.rm = TRUE),
q3 = quantile(Kg_diff_next, 0.75, na.rm = TRUE),
sd_diff = sd(Kg_diff_next, na.rm = TRUE),
n = sum(!is.na(Kg_diff_next)),
se_diff = sd_diff / sqrt(n),
.groups = "drop"
) |>
slice(1:10)
(p_place_summary <- place_summary |>
ggplot(aes(x = Place, y = mean_diff)) +
geom_bar(stat = "identity", colour = "gray90", fill = "gray60") +
geom_errorbar(
aes(
ymin = q1,
ymax = q3
),
width = 0.2,
linewidth = 0.8,
colour = "gray90"
) +
labs(
x = "Place",
y = "Median TotalKg Difference",
) +
scale_x_continuous(breaks = 1:10) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
plot_theme() +
theme(
axis.text = element_text(size = 22),
text = element_text(size = 20, color = "gray90"),
panel.grid = element_blank(),
axis.line = element_line(linewidth = 1.2, color = "gray80"),
axis.title.y = element_text(margin = margin(r = 8))
))ggsave(
filename = "../figs/p_place_summary.jpeg",
plot = p_place_summary,
height = 1500,
width = 2200,
units = "px"
)