From 516d22e4fe46f2f9fd4a28542c23552b8f1c2d4c Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 10:49:20 -0500 Subject: [PATCH 01/10] Remove duplicate write_captions() R function (which was added back in with a commit reversion in 2025) --- R/write_captions.R | 1102 ----------------------------------------- man/write_captions.Rd | 17 +- 2 files changed, 1 insertion(+), 1118 deletions(-) delete mode 100644 R/write_captions.R diff --git a/R/write_captions.R b/R/write_captions.R deleted file mode 100644 index 2f21b31f..00000000 --- a/R/write_captions.R +++ /dev/null @@ -1,1102 +0,0 @@ -#' Write captions and alternative text -#' -#' Function to create captions and alternative text that contain -#' key quantities from the model results file. -#' -#' @inheritParams plot_spawning_biomass -#' @param dir Directory where the output captions and alt text file should be -#' saved. Defaults to working directory. -#' @param year the last year of the data or the current year this function is -#' being performed. Defaults to the current year. -#' -#' @return Exports .csv with captions and alt text for figures and tables -#' that contain key quantities (e.g., an assessment's start year) that -#' are automatically extracted from the converted model results file. -#' -#' @export -#' -#' @examples -#' \dontrun{ -#' write_captions(dat, -#' dir = getwd(), -#' year = 2025 -#' ) -#' } -write_captions <- function(dat, # converted model output object - dir = getwd(), - year = format(Sys.Date(), "%Y")) { - # only extract key quantities/export new csv if not present - if (file.exists(fs::path(dir, "captions_alt_text.csv"))) { - cli::cli_alert_danger("Captions and alternative text file (captions_alt_text.csv) already exists; write_captions() will not run.", wrap = TRUE) - cli::cli_alert_info("To extract new key quantities and make a new captions_alt_text.csv file, delete existing captions_alt_text.csv and rerun write_captions().", wrap = TRUE) - } else { - # import pre-written captions and alt text that include placeholders - # for key quantities (e.g., 'start_year' is the placeholder for the - # assessment's start year) - caps_alttext <- utils::read.csv( - system.file("resources", "captions_alt_text_template.csv", package = "stockplotr") - ) - - dat <- dat |> - dplyr::mutate( - estimate = as.numeric(estimate), - year = as.numeric(year), - age = as.numeric(age) - ) - - # extract key quantities - # REMINDERS: - # -the variable names must exactly match those in the captions/alt text csv. - - # suppress warnings - options(warn = -1) - - # FIGURES----- - - ## kobe plot- don't code quantities yet - # kobe.end.year <- - # value of B/B(MSY) at the end year - # B.BMSY.end.yr <- B/BMSY - # --B = time series of biomass, last year - # --BMSY = dplyr::filter(grepl('b_target', label) | grepl('b_msy', label) | c(grepl('fishing_mortality_msy', label) & is.na(year))) - # CHECK: if length > 1, then select b_target - - # value of F/F(MSY) at the end year - # F.FMSY.end.yr <- - - # object that should be "is" or "is not" and answers the question, - # "the stock overfishing status ... overfished" - # overfished.status.is.isnot <- - - # object that should be "is" or "is not" and answers the question, - # "the stock ... experiencing overfishing" - # overfishing.status.is.isnot <- - - - ## Biomass plot - # biomass reference point - # B.ref.pt : added with add_more_key_quants - - # start year of biomass plot - B.start.year <- dat |> - dplyr::filter( - label == "biomass", - module_name == "TIME_SERIES" | module_name == "t.series", # SS3 and BAM target module names - is.na(fleet), - is.na(age) - ) |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of biomass plot - # B.end.year : added with add_more_key_quants - - # units of B (plural) - # B.units : added with add_more_key_quants - - # minimum B : added with add_more_key_quants - - # maximum B : added with add_more_key_quants - - - # TODO: uncomment and recode once we get clarity about how to extract this value properly - # R0 - # R0 <- dat |> - # dplyr::filter( - # # pull from BAM - # grepl('^recruitment$', label) & module_name == "parms" | - # grepl('^R0', label) | - # # pull from SS3 - # grepl('recruitment_virgin', label) - # ) |> - # dplyr::pull(estimate) |> - # unique() |> - # as.numeric() |> - # round(digits = 2) - - # Bend <- - - # TODO: uncomment and recode once we get clarity about how to extract this value properly - # Target biomass - # Btarg <- dat |> - # dplyr::filter(c(grepl('biomass', label) & grepl('target', label) & estimate >1) | label == 'biomass_msy') |> - # dplyr::pull(estimate) |> - # as.numeric() |> - # round(digits = 2) - - # Bmsy <- - - - # TODO: uncomment and recode once we get clarity about how to extract Btarg properly - ## relative B - # relative B min - # rel.B.min <- (B.min / Btarg) |> - # round(digits = 2) - # - # # relative B max - # rel.B.max <- (B.max / Btarg) |> - # round(digits = 2) - - # TODO: uncomment and recode once we get clarity about how to extract this value properly - ## mortality (F) plot - # F reference point - # F.ref.pt <- dat |> - # dplyr::filter( - # label == stringr::str_to_lower("F_targ") | - # label == stringr::str_to_lower("F_proxy") | - # label == stringr::str_to_lower("F_msy") | - # label == "F_target" - # # label == "F40" - # # label == "F30" - # # label == "F50" - # # label == "F_initial" - # # label == "Fmsy" - # ) |> - # dplyr::filter(module_name == "DERIVED_QUANTITIES" | module_name == "parms") |> - # dplyr::pull(estimate) |> - # as.numeric() |> - # round(digits = 2) - - # start year of F plot - F.start.year <- dat |> - dplyr::filter(label == "fishing_mortality") |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # terminal fishing mortality - # F.end.year : added with add_more_key_quants - - # minimum F - F.min <- dat |> - dplyr::filter(label == "fishing_mortality") - - if (length(unique(F.min$age)) == 1) { - if (is.na(unique(F.min$age))) { - F.min <- F.min |> - dplyr::filter(module_name %in% c("TIME_SERIES", "t.series")) |> - dplyr::slice(which.min(estimate)) |> - as.numeric() |> - round(digits = 2) - } - } else { - F.min <- F.min |> - dplyr::group_by(age) |> - dplyr::summarize(val = max(estimate)) |> - dplyr::slice(which.min(val)) |> - dplyr::select(val) |> - as.numeric() |> - round(digits = 2) - } - - - # maximum F - F.max <- dat |> - dplyr::filter(label == "fishing_mortality") - - if (length(unique(F.max$age)) == 1) { - if (is.na(unique(F.max$age))) { - F.min <- F.min |> - dplyr::filter(module_name %in% c("TIME_SERIES", "t.series")) |> - dplyr::slice(which.max(estimate)) |> - as.numeric() |> - round(digits = 2) - } - } else { - F.max <- F.max |> - dplyr::group_by(age) |> - dplyr::summarize(val = max(estimate)) |> - dplyr::slice(which.max(val)) |> - dplyr::select(val) |> - as.numeric() |> - round(digits = 2) - } - - # TODO: uncomment and recode once we get clarity about how to extract this value properly - # fishing mortality at msy - # Ftarg <- dat |> - # dplyr::filter(grepl('f_target', label) | - # grepl('f_msy', label) | - # c(grepl('fishing_mortality_msy', label) & is.na(year))) |> - # dplyr::pull(estimate) |> - # as.numeric() |> - # round(digits = 2) - - # Terminal year F respective to F target - # F.Ftarg : added with add_more_key_quants - - - ## landings plot - - # start year of landings plot - landings.start.year <- dat |> - dplyr::filter( - c(module_name == "t.series" & grepl("landings_observed", label)) | c(module_name == "CATCH" & grepl("ret_bio", label)), - # t.series is associated with a conversion from BAM output and CATCH with SS3 converted output - !is.na(fleet) - ) |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of landings plot - landings.end.year <- dat |> - dplyr::filter( - c(module_name == "t.series" & grepl("landings_observed", label)) | c(module_name == "CATCH" & grepl("ret_bio", label)), - # t.series is associated with a conversion from BAM output and CATCH with SS3 converted output - !is.na(fleet) - ) |> - dplyr::slice(which.max(year)) |> - dplyr::select(year) |> - as.numeric() - - # units of landings (plural) - # landings.units : added with add_more_key_quants - - # minimum landings - landings.min <- dat |> - dplyr::filter( - c(module_name == "t.series" & grepl("landings_observed", label)) | c(module_name == "CATCH" & grepl("ret_bio", label)), - # t.series is associated with a conversion from BAM output and CATCH with SS3 converted output - !is.na(fleet) - ) |> - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # maximum landings - landings.max <- dat |> - dplyr::filter( - c(module_name == "t.series" & grepl("landings_observed", label)) | c(module_name == "CATCH" & grepl("ret_bio", label)), - # t.series is associated with a conversion from BAM output and CATCH with SS3 converted output - !is.na(fleet) - ) |> - dplyr::group_by(fleet, year) |> - dplyr::summarise(max_est = max(estimate)) |> - dplyr::filter(!is.na(max_est)) |> - dplyr::group_by(year) |> - dplyr::summarise(max_est_yr = sum(max_est)) |> - dplyr::slice(which.max(max_est_yr)) |> - dplyr::select(max_est_yr) |> - as.numeric() |> - round(digits = 2) - - ## natural mortality (M)- bam examples have label as natural_mortality - ## but other formats don't (in input) - # minimum age of M - if ("natural_mortality" %in% dat$label) { - M.age.min <- dat |> - dplyr::filter(label == "natural_mortality") |> - dplyr::select(age) |> - dplyr::filter(!is.na(age)) |> - dplyr::slice(which.min(age)) |> - as.numeric() - } else { - M.age.min <- dat |> - # dplyr::filter(label == "natural_mortality") |> - dplyr::select(age) |> - dplyr::filter(!is.na(age)) |> - dplyr::slice(which.min(age)) |> - as.numeric() - } - - # maximum age of M - if ("natural_mortality" %in% dat$label) { - M.age.max <- dat |> - dplyr::filter(label == "natural_mortality") |> - dplyr::select(age) |> - dplyr::filter(!is.na(age)) |> - dplyr::slice(which.max(age)) |> - as.numeric() - } else { - M.age.max <- dat |> - # dplyr::filter(label == "natural_mortality") |> - dplyr::select(age) |> - dplyr::filter(!is.na(age)) |> - dplyr::slice(which.max(age)) |> - as.numeric() - } - - # minimum M rate- don't code quantities yet (see how it's coded in future fig) - # M.rate.min <- dat |> - # dplyr::filter( - # grepl("natural_mortality", label)) |> - # -label = natural_mortality (min); est in est col - - # maximum M rate- don't code quantities yet (see how it's coded in future fig) - # M.rate.max <- - # -label = natural_mortality (min); est in est col - - - ## vonB LAA (von Bertalanffy growth function + length at age)- don't code quantities yet - # vonb.age.min <- # minimum vonB age - # vonb.age.max <- # maximum vonB age - - # vonB length units (plural) - # vonb.length.units : added with add_more_key_quants - - # vonb.length.min <- # minimum vonB length - # vonb.length.max <- # minimum vonB length - - - ## length-type conversion plot- don't code quantities yet - # total length units (plural) - # total.length.units : added with add_more_key_quants - - # total.length.min <- # minimum total length - # total.length.max <- # maximum total length - # fork length units (plural) - # fork.length.units : added with add_more_key_quants - - # fork.length.min <- # minimum fork length - # fork.length.max <- # maximum fork length - - - ## weight-length conversion plot- don't code quantities yet - # length units (plural) - # wl.length.units : added with add_more_key_quants - - # wl.length.min <- # minimum length - # wl.length.max <- # maximum length - - # weight units (plural) - # wl.weight.units : added with add_more_key_quants - - # wl.weight.min <- # minimum weight - # wl.weight.max <- # maximum weight - - - ## maturity schedule (proportion mature)- don't code quantities yet - # length units (plural) - # prop.mat.length.units : added with add_more_key_quants - - # prop.mat.length.min <- # minimum length - # prop.mat.length.max <- # maximum length - - - ## fecundity at length- don't code quantities yet - # length units (plural) - # fecundity.length.units : added with add_more_key_quants - - # fecundity.length.min <- # minimum length - # fecundity.length.max <- # maximum length - - # fecundity units (plural) - # fecundity.units : added with add_more_key_quants - - # fecundity.min <- # minimum fecundity - # fecundity.max <- # maximum fecundity - - - ## catch at age (CAA) - # start year of CAA plot - caa.start.year <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of CAA plot - caa.end.year <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.max(year)) |> - dplyr::select(year) |> - as.numeric() - - # minimum age - caa.age.min <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.min(age)) |> - dplyr::select(age) |> - as.numeric() - - # maximum age - caa.age.max <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.max(age)) |> - dplyr::select(age) |> - as.numeric() - - - ## catch composition - # minimum & maximum catch - if (dim(dat |> - dplyr::filter(label == "catch"))[1] > 1) { - catch <- dat |> - dplyr::filter( - label == "catch", - !is.na(fleet) - ) |> - dplyr::mutate( - estimate = as.numeric(estimate), - year = as.numeric(year), - fleet = as.factor(fleet) - ) |> - dplyr::group_by(label, year, fleet) |> - dplyr::summarise(estimate = sum(estimate)) |> - dplyr::ungroup() - - tot.catch.min <- catch |> - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - tot.catch.max <- catch |> - dplyr::slice(which.max(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - } else { - tot.catch.min <- "NA" - tot.catch.max <- "NA" - } - - ## CAL (catch at length)- don't code quantities yet - # cal.length.min <- # minimum length group - # cal.length.max <- # maximum length group - # fleet.or.survey.name <- # fleet or survey name - - - ## CPUE indices plot- don't code quantities yet - # cpue.start.year <- # start year of CPUE indices plot - # cpue.end.year <- # end year of CPUE indices plot - - # CPUE units (plural) (SHARED with mod.fit.abun, below) - # cpue.units : added with add_more_key_quants - - # cpue.min <- # minimum CPUE (SHARED with mod_fit_abun, below) - # cpue.max <- # maximum CPUE (SHARED with mod_fit_abun, below) - - - ## NAA (numbers at age) - # start year of NAA plot - pop.naa.start.year <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of NAA plot - pop.naa.end.year <- dat |> - dplyr::filter( - label == "abundance" & !is.na(year), - era == "time" - ) |> - dplyr::slice(which.max(year)) |> - dplyr::select(year) |> - as.numeric() - - # minimum age - pop.naa.age.min <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.min(age)) |> - dplyr::select(age) |> - as.numeric() - - # maximum age - pop.naa.age.max <- dat |> - dplyr::filter(label == "abundance" & !is.na(year)) |> - dplyr::slice(which.max(age)) |> - dplyr::select(age) |> - as.numeric() - - # minimum abundance (number) of fish - pop.naa.fish.min <- dat |> - dplyr::filter( - grepl("abundance", label) & !is.na(year), - era == "time" - ) |> - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # maximum abundance (number) of fish - pop.naa.fish.max <- dat |> - dplyr::filter( - grepl("abundance", label) & !is.na(year), - era == "time" - ) |> - dplyr::slice(which.max(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - ## mod_fit_catch (model fit to catch ts)- don't code quantities yet - # mod.fit.catch.start.year <- # start year of model fit to catch ts plot - # mod.fit.catch.end.year <- # end year of model fit to catch ts plot - - # catch units (plural) - # mod.fit.catch.units : added with add_more_key_quants - - # mod.fit.catch.min <- # minimum catch - # mod.fit.catch.max <- # maximum catch - - - ## mod_fit_abun (model fit to abundance indices plot)- don't code quantities yet - # start year of model fit to abundance indices plot - # mod.fit.abun.start.year <- - - # end year of model fit to abundance indices plot - # mod.fit.abun.end.year <- - - ## mod_fit_discards- will be by fleet - ## for ss3, obs discards not in output file - ## -filter labels as discard_observed | discard_predicted | discard - ## -then group_by(year, fleet, label), then summarize(estimate_y = sum(estimate)) - ## ---then, get the following: - ## -change alt text so that we add the line's min/max, but analyst has to describe further - # mod.fit.discards.start.year <- # start year of model fit to discards plot - # mod.fit.discards.end.year <- # end year of F - # mod.fit.discards.units <- # discards units (plural) - # mod.fit.discards.min <- # minimum discards - # mod.fit.discards.max <- # maximum discards - - ## selectivity- don't code quantities yet - # selectivity.start.year <- # start year of selectivity plot - # selectivity.end.year <- # end year of selectivity plot - # selectivity.length.units <- # length units (plural) - # selectivity.length.min <- # minimum length - # selectivity.length.max <- # maximum length - - - ## estimated stock recruitment - # youngest-age recruited fish (instead of age-0) - sr.age.min <- dat |> - dplyr::filter(!is.na(year) & !is.na(age)) |> - dplyr::slice(which.min(age)) |> - dplyr::select(age) |> - as.numeric() - - # ssb units (plural) - # sr.ssb.units : added with add_more_key_quants - - # minimum ssb : added with add_more_key_quants - - # maximum ssb : added with add_more_key_quants - - # recruitment units (plural) - # sr.units : added with add_more_key_quants - - # minimum recruitment : added with add_more_key_quants - - # maximum recruitment: added with add_more_key_quants - - ## recruitment ts - # recruitment units (plural) - numbers of fish, in thousands - # recruitment.units : added with add_more_key_quants - - # start year of recruitment ts plot - recruitment.start.year <- dat |> - dplyr::filter( - label == "recruitment", - module_name == "TIME_SERIES" | module_name == "t.series", - !is.na(year), - is.na(fleet) | length(unique(fleet)) <= 1, - is.na(sex) | length(unique(sex)) <= 1, - is.na(area) | length(unique(area)) <= 1, - is.na(growth_pattern) | length(unique(growth_pattern)) <= 1, - !year %in% year_exclusions - ) |> # SS3 and BAM target module names - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of recruitment ts plot - # recruitment.end.year : added with add_more_key_quants - - # TODO: uncomment and recode once we get clarity about how to extract R0 properly - ## relative recruitment - # # minimum relative recruitment - # rel.recruitment.min <- (sr.min / R0) |> - # round(digits = 2) - # - # # maximum relative recruitment - # rel.recruitment.max <- (sr.max / R0) |> - # round(digits = 2) - - - ## recruitment deviations - # start year of recruitment deviations plot - recruit.dev.start.year <- dat |> - dplyr::filter( - label == "recruitment_deviations" | label == "log_recruitment_deviations", - module_name == "SPAWN_RECRUIT" | module_name == "t.series", - !is.na(year), - is.na(fleet) | length(unique(fleet)) <= 1, - is.na(sex) | length(unique(sex)) <= 1, - is.na(area) | length(unique(area)) <= 1, - is.na(growth_pattern) | length(unique(growth_pattern)) <= 1, - !year %in% year_exclusions - ) |> # SS3 and BAM target module names - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of recruitment deviations plot - # recruit.dev.end.year : added with add_more_key_quants - - # minimum recruitment deviation - recruit.dev.min <- dat |> - dplyr::filter( - label == "recruitment_deviations" | label == "log_recruitment_deviations", - module_name == "SPAWN_RECRUIT" | module_name == "t.series", - !is.na(year), - is.na(fleet) | length(unique(fleet)) <= 1, - is.na(sex) | length(unique(sex)) <= 1, - is.na(area) | length(unique(area)) <= 1, - is.na(growth_pattern) | length(unique(growth_pattern)) <= 1, - !year %in% year_exclusions - ) |> # SS3 and BAM target module names - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # maximum recruitment deviation - recruit.dev.max <- dat |> - dplyr::filter( - label == "recruitment_deviations" | label == "log_recruitment_deviations", - module_name == "SPAWN_RECRUIT" | module_name == "t.series", - !is.na(year), - is.na(fleet) | length(unique(fleet)) <= 1, - is.na(sex) | length(unique(sex)) <= 1, - is.na(area) | length(unique(area)) <= 1, - is.na(growth_pattern) | length(unique(growth_pattern)) <= 1, - !year %in% year_exclusions - ) |> # SS3 and BAM target module names - dplyr::slice(which.max(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - ## tot_b (total biomass): same as B plot above - - ## spawning_biomass (ssb) - # start year of ssb plot - ssb.start.year <- dat |> - dplyr::filter( - label == "spawning_biomass", - module_name %in% c("DERIVED_QUANTITIES", "t.series") - ) |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() |> - round(digits = 2) - - # end year of ssb plot - # ssb.end.year : added with add_more_key_quants - - # ssb units (plural) - # ssb.units : added with add_more_key_quants - - # minimum ssb - # ssb.min : added with add_more_key_quants - - # maximum ssb - # ssb.max : added with add_more_key_quants - - # ssb reference point - # ssb.ref.pt : added with add_more_key_quants - - # ssbtarg : added with add_more_key_quants - - ## relative ssb - # relative ssb min - # rel.ssb.min : added with add_more_key_quants - - # relative ssb max - # rel.ssb.max : added with add_more_key_quants - - - ## spr (spawning potential ratio) - # minimum spr - spr.min <- dat |> - dplyr::filter(c(grepl("spr", label) | - label == "spr") & - !is.na(year) & - !is.na(estimate)) |> - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # maximum spr - spr.max <- dat |> - dplyr::filter(c(grepl("spr", label) | - label == "spr") & !is.na(year) & !is.na(estimate)) |> - dplyr::slice(which.max(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # TODO: uncomment and recode once we get clarity about how to extract this value properly - # spr reference point - # spr.ref.pt <- dat |> - # dplyr::filter(label == "spr_msy") |> - # dplyr::select(estimate) |> - # as.numeric()# |> - # round(digits = 2) - - - ## pop.baa (population biomass at age) - # start year of pop.baa plot - pop.baa.start.year <- dat |> - dplyr::filter(grepl("^biomass", label)) |> - dplyr::slice(which.min(year)) |> - dplyr::select(year) |> - as.numeric() - - # end year of pop.baa plot - pop.baa.end.year <- dat |> - dplyr::filter( - grepl("^biomass", label), - era == "time" - ) |> - dplyr::slice(which.max(year)) |> - dplyr::select(year) |> - as.numeric() - - # minimum biomass of fish - pop.baa.fish.min <- dat |> - dplyr::filter( - grepl("^biomass", label) & !is.na(year), - era == "time" - ) |> - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # maximum biomass of fish - pop.baa.fish.max <- dat |> - dplyr::filter( - grepl("^biomass", label) & !is.na(year), - era == "time" - ) |> - dplyr::slice(which.max(estimate)) |> - dplyr::select(estimate) |> - as.numeric() |> - round(digits = 2) - - # minimum age - pop.baa.age.min <- dat |> - dplyr::filter( - label == "biomass", - module_name == "BIOMASS_AT_AGE" | module_name == "B.age", # SS3 and BAM target module names - !is.na(age) - ) |> - dplyr::slice(which.min(age)) |> - dplyr::select(age) |> - as.numeric() - - # maximum age - pop.baa.age.max <- dat |> - dplyr::filter( - label == "biomass", - module_name == "BIOMASS_AT_AGE" | module_name == "B.age", # SS3 and BAM target module names - !is.na(age) - ) |> - dplyr::slice(which.max(age)) |> - dplyr::select(age) |> - as.numeric() - - - ## proj_catch (projected catch) - # projected catch units (plural) - # proj.catch.units <- # probably mt, but wait until figure coded - # --then add into add_more_key_quants() - - # start year of projected catch plot - proj.catch.start.year <- landings.end.year + 1 - - # end year of projected catch plot - proj.catch.end.year <- dat |> - dplyr::filter(label == "catch" & module_name == "DERIVED_QUANTITIES") |> - dplyr::slice(which.max(year)) |> - dplyr::select(year) |> - as.numeric() - - # minimum projected catch - proj.catch.min <- dat |> - # no BAM file has catch; will be NA - dplyr::filter(label == "catch" & module_name == "DERIVED_QUANTITIES") |> - dplyr::slice(which.min(estimate)) |> - dplyr::select(estimate) |> - as.numeric() - - # maximum projected catch - proj.catch.max <- dat |> - dplyr::filter(label == "catch" & module_name == "DERIVED_QUANTITIES") |> - dplyr::slice(which.max(estimate)) |> - dplyr::select(estimate) |> - as.numeric() - - # TABLES----- - - ## catch - # catch.fleet <- # fleet - - ## landings - # landings.tbl.units <- # landings units; remove if units already in table - - ## discards - # discards.tbl.units <- # discards units - - ## catchability - # catchability.fleet <- # fleet - - - # add in more quantities here, and update the quantities above - - # substitute quantity placeholders in the captions/alt text with - # the real values, extracted above - - - # make list with all placeholders - # uncomment placeholders once uncommented, above - patterns_replacements <- c( - # FIGURES----- - - ## kobe plot - # 'kobe.end.year' = as.character(kobe.end.year), - # 'B.BMSY.end.yr' = as.character(B.BMSY.end.yr), - # 'F.FMSY.end.yr' = as.character(F.FMSY.end.yr), - # 'overfished.status.is.isnot' = as.character(overfished.status.is.isnot), - # 'overfishing.status.is.isnot' = as.character(overfishing.status.is.isnot), - - ## Relative biomass plot - # NOTE: moving this above biomass so rel.B.min isn't changed to "rel." + B.min (etc.) - # 'rel.B.min' = as.character(rel.B.min), - # 'rel.B.max' = as.character(rel.B.max), - - ## Biomass plot - "B.start.year" = as.character(B.start.year), - # 'R0' = as.character(R0), - # 'Bend' = as.character(Bend), - # 'Btarg' = as.character(Btarg), - # 'Bmsy' = as.character(Bmsy), - - ## mortality (F) plot - # 'F.ref.pt' = as.character(F.ref.pt), - "F.start.year" = as.character(F.start.year), - "F.min" = as.character(F.min), - "F.max" = as.character(F.max), - # 'Ftarg' = as.character(Ftarg), - - ## landings plot - "landings.start.year" = as.character(landings.start.year), - "landings.end.year" = as.character(landings.end.year), - "landings.min" = as.character(landings.min), - "landings.max" = as.character(landings.max), - - ## natural mortality (M) - "M.age.min" = as.character(M.age.min), - "M.age.max" = as.character(M.age.max), - # 'M.rate.min' = as.character(M.rate.min), - # 'M.rate.max' = as.character(M.rate.max), - - ## vonB LAA (von Bertalanffy growth function + length at age) - # 'vonb.age.min' = as.character(vonb.age.min), - # 'vonb.age.max' = as.character(vonb.age.max), - # 'vonb.length.units' = as.character(vonb.length.units), - # 'vonb.length.min' = as.character(vonb.length.min), - # 'vonb.length.max' = as.character(vonb.length.max), - - ## length-type conversion plot - # 'total.length.units' = as.character(total.length.units), - # 'total.length.min' = as.character(total.length.min), - # 'total.length.max' = as.character(total.length.max), - # 'fork.length.units' = as.character(fork.length.units), - # 'fork.length.min' = as.character(fork.length.min), - # 'fork.length.max' = as.character(fork.length.max), - - ## weight-length conversion plot - # 'wl.length.units' = as.character(wl.length.units), - # 'wl.length.min' = as.character(wl.length.min), - # 'wl.length.max' = as.character(wl.length.max), - # 'wl.weight.units' = as.character(wl.weight.units), - # 'wl.weight.min' = as.character(wl.weight.min), - # 'wl.weight.max' = as.character(wl.weight.max), - - ## maturity schedule (proportion mature) - # 'prop.mat.length.units' = as.character(prop.mat.length.units), - # 'prop.mat.length.min' = as.character(prop.mat.length.min), - # 'prop.mat.length.max' = as.character(prop.mat.length.max), - - ## fecundity at length - # 'fecundity.length.units' = as.character(fecundity.length.units), - # 'fecundity.length.min' = as.character(fecundity.length.min), - # 'fecundity.length.max' = as.character(fecundity.length.max), - # 'fecundity.units' = as.character(fecundity.units), - # 'fecundity.min' = as.character(fecundity.min), - # 'fecundity.max' = as.character(fecundity.max), - - ## CAA (catch at age) - "caa.start.year" = as.character(caa.start.year), - "caa.end.year" = as.character(caa.end.year), - "caa.age.min" = as.character(caa.age.min), - "caa.age.max" = as.character(caa.age.max), - - - ## catch comp - "tot.catch.min" = as.character(tot.catch.min), - "tot.catch.max" = as.character(tot.catch.max), - - ## CAL (catch at length) - # 'cal.length.min' = as.character(cal.length.min), - # 'cal.length.max' = as.character(cal.length.max), - # 'fleet.or.survey.name' = as.character(fleet.or.survey.name), - - ## CPUE indices plot - # 'cpue.start.year' = as.character(cpue.start.year), - # 'cpue.end.year' = as.character(cpue.end.year), - # 'cpue.min' = as.character(cpue.min), - # 'cpue.max' = as.character(cpue.max), - - ## NAA (numbers at age) - "pop.naa.start.year" = as.character(pop.naa.start.year), - "pop.naa.end.year" = as.character(pop.naa.end.year), - "pop.naa.age.min" = as.character(pop.naa.age.min), - "pop.naa.age.max" = as.character(pop.naa.age.max), - "pop.naa.fish.min" = as.character(pop.naa.fish.min), - "pop.naa.fish.max" = as.character(pop.naa.fish.max), - - ## mod_fit_catch (model fit to catch ts) - # 'mod.fit.catch.start.year' = as.character(mod.fit.catch.start.year), - # 'mod.fit.catch.end.year' = as.character(mod.fit.catch.end.year), - # 'mod.fit.catch.units' = as.character(mod.fit.catch.units), - # 'mod.fit.catch.min' = as.character(mod.fit.catch.min), - # 'mod.fit.catch.max' = as.character(mod.fit.catch.max), - - ## mod_fit_abun (model fit to abundance indices plot) - # 'mod.fit.abun.start.year' = as.character(mod.fit.abun.start.year), - # 'mod.fit.abun.end.year' = as.character(mod.fit.abun.end.year), - - ## mod_fit_discards - # 'mod.fit.discards.start.year' = as.character(mod.fit.discards.start.year), - # 'mod.fit.discards.end.year' = as.character(mod.fit.discards.end.year), - # 'mod.fit.discards.units' = as.character(mod.fit.discards.units), - # 'mod.fit.discards.min' = as.character(mod.fit.discards.min), - # 'mod.fit.discards.max' = as.character(mod.fit.discards.max), - - ## selectivity - # 'selectivity.start.year' = as.character(selectivity.start.year), - # 'selectivity.end.year' = as.character(selectivity.end.year), - # 'selectivity.length.units' = as.character(selectivity.length.units), - # 'selectivity.length.min' = as.character(selectivity.length.min), - # 'selectivity.length.max' = as.character(selectivity.length.max), - - ## estimated stock recruitment (aka spawning stock biomass) - # 'sr.age.min' = as.character(sr.age.min), - - # relative recruitment ts - # NOTE: moving this above recruitment so rel.recruitment.min isn't changed - # to "rel." + recruitment.min (etc.) - # 'rel.recruitment.min' = as.character(rel.recruitment.min), - # 'rel.recruitment.max' = as.character(rel.recruitment.max), - - ## recruitment ts - "recruitment.start.year" = as.character(recruitment.start.year), - - ## recruitment deviations - "recruit.dev.start.year" = as.character(recruit.dev.start.year), - "recruit.dev.min" = as.character(recruit.dev.min), - "recruit.dev.max" = as.character(recruit.dev.max), - - ## spawning.biomass (ssb) - "ssb.start.year" = as.character(ssb.start.year), - - ## spr (spawning potential ratio) - "spr.min" = as.character(spr.min), - "spr.max" = as.character(spr.max), - # 'spr.ref.pt' = as.character(spr.ref.pt), - - # ## pop.baa (population biomass at age) - "pop.baa.start.year" = as.character(pop.baa.start.year), - "pop.baa.end.year" = as.character(pop.baa.end.year), - "pop.baa.fish.min" = as.character(pop.baa.fish.min), - "pop.baa.fish.max" = as.character(pop.baa.fish.max), - "pop.baa.age.min" = as.character(pop.baa.age.min), - "pop.baa.age.max" = as.character(pop.baa.age.max), - - - ## proj_catch (projected catch) - # 'proj.catch.units' = as.character(proj.catch.units), - "proj.catch.start.year" = as.character(proj.catch.start.year), - "proj.catch.end.year" = as.character(proj.catch.end.year), - "proj.catch.min" = as.character(proj.catch.min), - "proj.catch.max" = as.character(proj.catch.max) # , - - # # TABLES----- - # - # ## catch - # 'catch.fleet' = as.character(catch.fleet), - # - # ## landings - # 'landings.tbl.units' = as.character(landings.tbl.units), - # - # ## discards - # 'discards.tbl.units' = as.character(discards.tbl.units), - # - # ## catchability - # 'catchability.fleet' = as.character(catchability.fleet) - ) - - # If a value in patterns_replacements = NA, then make it "NA" - # to avoid errors - patterns_replacements <- tidyr::replace_na(patterns_replacements, "NA") - - # take the values associated with the quantities and replace the df's - # placeholders with them. For example, if ssb_min = 10, this will replace - # "the minimum ssb = ssb_min" with "the minimum ssb = 10". - - # replace values in caption column - caps_alttext$caption <- stringr::str_replace_all( - caps_alttext$caption, - patterns_replacements - ) - - # replace values in alt text column - caps_alttext$alt_text <- stringr::str_replace_all( - caps_alttext$alt_text, - patterns_replacements - ) - - # export df with updated captions and alt text to csv - utils::write.csv( - x = caps_alttext, - file = fs::path( - dir, - "captions_alt_text.csv" - ), - row.names = FALSE - ) - - - # message explaining the extracted and inserted key quantities - replaced_vals <- patterns_replacements |> - as.data.frame() |> - tibble::rownames_to_column() |> - dplyr::rename( - "name" = 1, - "key_quantity" = 2 - ) - - cli::cli_h3("Key quantities extracted and inserted from write_captions().") - cli::cli_alert_info("NA values signify key quantities that were not extracted and inserted.", wrap = TRUE) - for (i in 1:dim(replaced_vals)[1]) { - cli::cli_li(paste0( - replaced_vals[i, 1], - ": ", - replaced_vals[i, 2] - )) - } - - # enable warnings again - options(warn = 0) - } -} diff --git a/man/write_captions.Rd b/man/write_captions.Rd index 5dcb7fc3..78bcee4a 100644 --- a/man/write_captions.Rd +++ b/man/write_captions.Rd @@ -1,11 +1,9 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/utils_rda.R, R/write_captions.R +% Please edit documentation in R/utils_rda.R \name{write_captions} \alias{write_captions} \title{Write captions and alternative text} \usage{ -write_captions(dat, dir = getwd(), year = format(Sys.Date(), "\%Y")) - write_captions(dat, dir = getwd(), year = format(Sys.Date(), "\%Y")) } \arguments{ @@ -20,18 +18,11 @@ saved. Defaults to working directory.} being performed. Defaults to the current year.} } \value{ -Exports .csv with captions and alt text for figures and tables -that contain key quantities (e.g., an assessment's start year) that -are automatically extracted from the converted model results file. - Exports .csv with captions and alt text for figures and tables that contain key quantities (e.g., an assessment's start year) that are automatically extracted from the converted model results file. } \description{ -Function to create captions and alternative text that contain -key quantities from the model results file. - Function to create captions and alternative text that contain key quantities from the model results file. } @@ -42,10 +33,4 @@ write_captions(dat, year = 2025 ) } -\dontrun{ -write_captions(dat, - dir = getwd(), - year = 2025 -) -} } From 1a1291caa1e94465216f7c7cd2ef97c8375a2cde Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 10:53:53 -0500 Subject: [PATCH 02/10] Replace pop.baa and pop.naa with full names of plots for labels (biomass and abundance at age, respectively) --- R/plot_abundance_at_age.R | 3 ++- R/plot_biomass_at_age.R | 3 ++- inst/resources/captions_alt_text_template.csv | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/R/plot_abundance_at_age.R b/R/plot_abundance_at_age.R index d4631943..9828ad79 100644 --- a/R/plot_abundance_at_age.R +++ b/R/plot_abundance_at_age.R @@ -113,7 +113,8 @@ plot_abundance_at_age <- function( if (make_rda == TRUE) { create_rda( object = plot, - topic_label = "pop.naa", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat, unit_label = "mt" diff --git a/R/plot_biomass_at_age.R b/R/plot_biomass_at_age.R index 1c3f671d..a2417982 100644 --- a/R/plot_biomass_at_age.R +++ b/R/plot_biomass_at_age.R @@ -97,7 +97,8 @@ plot_biomass_at_age <- function( if (make_rda == TRUE) { create_rda( object = plot, - topic_label = "pop.baa", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat, unit_label = "mt" diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index ae5cc77f..47619e0f 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -14,7 +14,7 @@ fecundity.at.length,figure,Fecundity (in number of eggs) as a function of fish l catch,figure,"Historical catch for each year in which there is composition data, for each fleet or survey.","Cumulative area plot showing the catch for each year and fleet or survey. The x axis shows the year, which spans from catch.year.min to catch.year.max. The y axis shows the proportion of the total catch by each fleet or survey and spans from tot.catch.min to tot.catch.max." CAL,figure,"Histograms showing the proportion of the catch in each length group, each year for which there is composition data, for fleet or survey fleet.or.survey.name.","Histograms for each year and fleet for which there is data (one per year grouped by fleet or survey), which show the proportion of the catch in each length group. The x axis of each histogram contains length intervals, which span from cal.length.min to cal.length.max. The y axis of each histogram contains the proportion of the catch and spans from 0--1." CPUE.indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." -pop.naa,figure,Model estimate of population numbers at age over time. The relative size of each bubble for a given year and age indicates the relative abundance in that category compared with others. ,"Bubble plot showing relative age proportions over time. The x axis shows the year, which spans from pop.naa.start.year to pop.naa.end.year . The y axis shows age in years, which spans from pop.naa.age.min to pop.naa.age.max. The size of the bubbles range from pop.naa.fish.min to pop.naa.fish.max." +abundance_at_age,figure,Model estimate of population numbers at age over time. The relative size of each bubble for a given year and age indicates the relative abundance in that category compared with others. ,"Bubble plot showing relative age proportions over time. The x axis shows the year, which spans from pop.naa.start.year to pop.naa.end.year . The y axis shows age in years, which spans from pop.naa.age.min to pop.naa.age.max. The size of the bubbles range from pop.naa.fish.min to pop.naa.fish.max." mod.fit.catch,figure,Observed catch from the data input file (points) and model estimated catch (line) over time for fleet.or.survey.name. ,"Point and line graph showing observed catch from the data input file as points and model estimated catch as a line over time for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.catch.start.year to mod.fit.catch.end.year . The y axis shows catch in mod.fit.catch.units, which spans from mod.fit.catch.min to mod.fit.catch.max." mod.fit.abun,figure,Assessment model fits to input catch per unit of effort index values over time calculated from fleet.or.survey.name.,"Point and line graph showing the assessment model fit, displayed as a line, to input catch per unit effort index values, displayed as points over time, for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.abun.start.year to mod.fit.abun.end.year . The y axis shows catch per unit effort in cpue.units, which spans from cpue.min to cpue.max." mod.fit.discards,figure,Observed discards (points) and estimated discards (line).,"Point and line graph showing the assessment model fit to observed discards. Observed discards are represented as points while the model fitted estimates are represented as a line over time for fleet.or.survey.name. The x axis shows the year, which spans from mod.fit.discards.start.year to mod.fit.discards.end.year . The y axis shows discards in mod.fit.discards.units, which spans from mod.fit.discards.min to mod.fit.discards.max." @@ -28,7 +28,7 @@ tot.b,figure,Estimated biomass (B) time series. The horizontal dashed line repre spawning.biomass,figure,Estimated spawning stock biomass (SSB) time series. The horizontal dashed line represents the spawning stock biomass associated with the biomass limit reference point (ssb.ref.pt ssb.units).,"Line graph showing estimated spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated spawning stock biomass in ssb.units, which spans from ssb.min to ssb.max." relative.spawning.biomass,figure,Estimated relative spawning stock biomass time series. The horizontal dashed line represents the limit reference point calculated as SSB/SSB(reference point) (ssb.ref.pt ssb.units).,"Line graph showing estimated relative spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated relative spawning stock biomass (SSB/SSB~target~), which spans from rel.ssb.min to rel.ssb.max ssb.units." spr,figure,Estimated spawning potential ratio (SPR) (SSB~current~/SSB~target~) time series. The horizontal dashed line represents the spawning potential ratio of the limit reference point at spr.ref.pt.,"Line graph showing estimated spawning potential ratio over time. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated spawning potential ratio in SSB~current~/SSB~target~, which spans from spr.min to spr.max." -pop.baa,figure,Estimated population numbers at age and population biomass at age over time. The relative size of each bubble for a given year and age indicates the relative abundance or biomass in that category compared with others. ,"Bubble plot showing estimated population numbers at age and population biomass at age. The x axis shows the year, which spans from pop.baa.start.year to pop.baa.end.year . The y axis shows age, which spans from pop.baa.age.min to pop.baa.age.max. The size of the bubbles range from pop.baa.fish.min to pop.baa.fish.max." +biomass_at_age,figure,Estimated population numbers at age and population biomass at age over time. The relative size of each bubble for a given year and age indicates the relative abundance or biomass in that category compared with others. ,"Bubble plot showing estimated population numbers at age and population biomass at age. The x axis shows the year, which spans from pop.baa.start.year to pop.baa.end.year . The y axis shows age, which spans from pop.baa.age.min to pop.baa.age.max. The size of the bubbles range from pop.baa.fish.min to pop.baa.fish.max." proj.catch,figure,Forecasted catch in proj.catch.units over future years for different fishing mortality scenarios as indicated in the legend.,"Time series line graph showing forecasted catch over future years for different fishing mortality scenarios. The x axis shows the year, which spans from proj.catch.start.year to proj.catch.end.year . The y axis shows catch in proj.catch.units, which spans from proj.catch.min to proj.catch.max." proj.biomass,table,Forecasted biomass over future years for different fishing mortality scenarios., report.version.model.changes,table,Document version history briefly describing when major changes or updates are made to each version of the report., From f27eb98d2a168a5afe772f45bb70f6026dca98df Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 10:56:39 -0500 Subject: [PATCH 03/10] Replace relative.biomass and pop.caa with full names of plots for labels (relative_biomass and catch comp, respectively) --- R/plot_biomass.R | 2 +- R/plot_catch_comp.R | 3 ++- inst/resources/captions_alt_text_template.csv | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/R/plot_biomass.R b/R/plot_biomass.R index c75f6798..944c5ac1 100644 --- a/R/plot_biomass.R +++ b/R/plot_biomass.R @@ -151,7 +151,7 @@ plot_biomass <- function( if (make_rda) { create_rda( object = final, - topic_label = ifelse(relative, "relative.biomass", "biomass"), + topic_label = ifelse(relative, "relative_biomass", "biomass"), fig_or_table = "figure", dat = rp_dat, dir = figures_dir, diff --git a/R/plot_catch_comp.R b/R/plot_catch_comp.R index 675b1463..4fc178ae 100644 --- a/R/plot_catch_comp.R +++ b/R/plot_catch_comp.R @@ -113,7 +113,8 @@ plot_catch_comp <- function( if (make_rda == TRUE) { create_rda( object = plot, - topic_label = "pop.caa", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat, unit_label = "mt" diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index 47619e0f..b5f1b2dd 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -1,7 +1,7 @@ label,type,caption,alt_text kobe,figure,"Kobe plot showing stock status. Triangles delineate start and end years. Horizontal and vertical dashed lines delineate the proportion of F/F~MSY~ where F~MSY~ = B.ref.pt, and B/B~MSY~ where B~MSY~ = B.ref.pt. Overfishing is occurring when F/F~MSY~ > 1 and an overfished status is indicated where B/B~MSY~ > 1.","A Kobe plot showing stock status. The x axis shows overfished status (i.e., B/B~MSY~) and the y axis shows overfishing (i.e., F/F~MSY~). The B/B~MSY~ and F/F~MSY~ for kobe.end.year were B.BMSY.end.yr and F.FMSY.end.yr, respectively, indicating that the stock overfished.status.is.isnot overfished and overfishing.status.is.is.not experiencing overfishing." biomass,figure,Biomass (B) time series. The horizontal dashed line represents the limit reference point (B.ref.pt B.units).,"Line graph showing biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows biomass in B.units, which spans from B.min to B.max." -relative.biomass,figure,Relative biomass (B) time series. The horizontal dashed line represents the limit reference point calculated as B/B(reference point) (B.ref.point B.units).,"Line graph showing relative biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows relative biomass (B/B~target~), which spans from rel.B.min to rel.B.max B.units ." +relative_biomass,figure,Relative biomass (B) time series. The horizontal dashed line represents the limit reference point calculated as B/B(reference point) (B.ref.point B.units).,"Line graph showing relative biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows relative biomass (B/B~target~), which spans from rel.B.min to rel.B.max B.units ." fishing.mortality,figure,Fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows fishing mortality in F.units, which spans from F.min to F.max." relative.fishing.mortality,figure,Relative fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows relative fishing mortality (F/F~target~), which spans from rel.F.min to rel.F.max." landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." @@ -47,4 +47,4 @@ bnc,table,"Historical biomass, spawning biomass, abundance, and catch time ser naa,table,Historical population abundance (numbers) estimated by the base model for each age group., catchability,table,Catchability over time for fleet catchability.fleet., sensitivity.runs,table,"Forecasted catch, biomass, spawning biomass, recruitment, fishing mortality, and stock status as projected from the base model configuration.", -pop.caa,figure,Fishery age composition (caa.start.year-caa.end.year). The area of the circle is proportional to the catch. Diagonal lines indicated the top 5\\% strongest year classes.,"Bubble plot showing estimated total catch at age. The x axis shows the year, which spans from caa.start.year to caa.end.year . The y axis shows age, which spans from caa.age.min to caa.age.max. The size of the bubbles range from tot.catch.min to tot.catch.max." +catch_comp,figure,Fishery age composition (caa.start.year-caa.end.year). The area of the circle is proportional to the catch. Diagonal lines indicated the top 5\\% strongest year classes.,"Bubble plot showing estimated total catch at age. The x axis shows the year, which spans from caa.start.year to caa.end.year . The y axis shows age, which spans from caa.age.min to caa.age.max. The size of the bubbles range from tot.catch.min to tot.catch.max." From e47b835a51665273e637909332bf2ddfd7cedf68 Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 11:19:01 -0500 Subject: [PATCH 04/10] Replace fishing.mortality and CPUE.indices with full names of plots for labels (fishing_mortality and indices, respectively) --- R/plot_fishing_mortality.R | 2 +- R/plot_indices.R | 3 ++- R/utils_rda.R | 2 +- inst/resources/captions_alt_text_template.csv | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/R/plot_fishing_mortality.R b/R/plot_fishing_mortality.R index 7d967944..d34d8ca5 100644 --- a/R/plot_fishing_mortality.R +++ b/R/plot_fishing_mortality.R @@ -97,7 +97,7 @@ plot_fishing_mortality <- function( if (make_rda) { create_rda( object = final, - topic_label = ifelse(relative, "relative.fishing.mortality", "fishing.mortality"), + topic_label = ifelse(relative, "relative_fishing_mortality", "fishing_mortality"), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/plot_indices.R b/R/plot_indices.R index c9384619..542216a8 100644 --- a/R/plot_indices.R +++ b/R/plot_indices.R @@ -116,7 +116,8 @@ plot_indices <- function( if (make_rda) { create_rda( object = plt, - topic_label = "CPUE.indices", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/utils_rda.R b/R/utils_rda.R index 4927207d..25c46168 100644 --- a/R/utils_rda.R +++ b/R/utils_rda.R @@ -151,7 +151,7 @@ add_more_key_quants <- function( # calculate key quantities that rely on end_year for calculation ## terminal fishing mortality - # if (topic_cap_alt$label == "fishing.mortality") { + # if (topic_cap_alt$label == "fishing_mortality") { # if (is.null(dat)) { # cli::cli_alert_warning("Some key quantities associated with fishing mortality were not extracted and added to captions_alt_text.csv due to missing data file (i.e., 'dat' argument).", wrap = TRUE) # } else { diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index b5f1b2dd..a62224fc 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -2,8 +2,8 @@ label,type,caption,alt_text kobe,figure,"Kobe plot showing stock status. Triangles delineate start and end years. Horizontal and vertical dashed lines delineate the proportion of F/F~MSY~ where F~MSY~ = B.ref.pt, and B/B~MSY~ where B~MSY~ = B.ref.pt. Overfishing is occurring when F/F~MSY~ > 1 and an overfished status is indicated where B/B~MSY~ > 1.","A Kobe plot showing stock status. The x axis shows overfished status (i.e., B/B~MSY~) and the y axis shows overfishing (i.e., F/F~MSY~). The B/B~MSY~ and F/F~MSY~ for kobe.end.year were B.BMSY.end.yr and F.FMSY.end.yr, respectively, indicating that the stock overfished.status.is.isnot overfished and overfishing.status.is.is.not experiencing overfishing." biomass,figure,Biomass (B) time series. The horizontal dashed line represents the limit reference point (B.ref.pt B.units).,"Line graph showing biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows biomass in B.units, which spans from B.min to B.max." relative_biomass,figure,Relative biomass (B) time series. The horizontal dashed line represents the limit reference point calculated as B/B(reference point) (B.ref.point B.units).,"Line graph showing relative biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows relative biomass (B/B~target~), which spans from rel.B.min to rel.B.max B.units ." -fishing.mortality,figure,Fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows fishing mortality in F.units, which spans from F.min to F.max." -relative.fishing.mortality,figure,Relative fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows relative fishing mortality (F/F~target~), which spans from rel.F.min to rel.F.max." +fishing_mortality,figure,Fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows fishing mortality in F.units, which spans from F.min to F.max." +relative_fishing_mortality,figure,Relative fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows relative fishing mortality (F/F~target~), which spans from rel.F.min to rel.F.max." landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." natural.mortality,figure,Natural mortality (M) for each age. ,"Line graph showing natural mortality. The x axis shows age in years, which spans from M.age.min to M.age.max. The y axis shows the natural mortality rate per year, which spans from M.rate.min to M.rate.max." vonb.laa,figure,Aged and measured fish (points) and von Bertalanffy growth function (line) fit to the data.,"Point and line graph showing observations of measured age and length data as points and the von Bertalanffy relationship fit to this data as a line with 95\\% confidence intervals. The x axis shows age in years, which spans from vonb.age.min to vonb.age.max. The y axis shows length in vonb.length.units, which spans from vonb.length.min to vonb.length.max." @@ -13,7 +13,7 @@ maturity.schedule,figure,The relationship between the proportion mature and fish fecundity.at.length,figure,Fecundity (in number of eggs) as a function of fish length. ,"Point and line graph showing observations of measured fecundity and measured length from the same fish and an exponential fit through those points displayed as a line. The x axis shows length in fecundity.length.units, which spans from fecundity.length.min to fecundity.length.max. The y axis shows fecundity in fecundity.units, which spans from fecundity.min to fecundity.max." catch,figure,"Historical catch for each year in which there is composition data, for each fleet or survey.","Cumulative area plot showing the catch for each year and fleet or survey. The x axis shows the year, which spans from catch.year.min to catch.year.max. The y axis shows the proportion of the total catch by each fleet or survey and spans from tot.catch.min to tot.catch.max." CAL,figure,"Histograms showing the proportion of the catch in each length group, each year for which there is composition data, for fleet or survey fleet.or.survey.name.","Histograms for each year and fleet for which there is data (one per year grouped by fleet or survey), which show the proportion of the catch in each length group. The x axis of each histogram contains length intervals, which span from cal.length.min to cal.length.max. The y axis of each histogram contains the proportion of the catch and spans from 0--1." -CPUE.indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." +indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." abundance_at_age,figure,Model estimate of population numbers at age over time. The relative size of each bubble for a given year and age indicates the relative abundance in that category compared with others. ,"Bubble plot showing relative age proportions over time. The x axis shows the year, which spans from pop.naa.start.year to pop.naa.end.year . The y axis shows age in years, which spans from pop.naa.age.min to pop.naa.age.max. The size of the bubbles range from pop.naa.fish.min to pop.naa.fish.max." mod.fit.catch,figure,Observed catch from the data input file (points) and model estimated catch (line) over time for fleet.or.survey.name. ,"Point and line graph showing observed catch from the data input file as points and model estimated catch as a line over time for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.catch.start.year to mod.fit.catch.end.year . The y axis shows catch in mod.fit.catch.units, which spans from mod.fit.catch.min to mod.fit.catch.max." mod.fit.abun,figure,Assessment model fits to input catch per unit of effort index values over time calculated from fleet.or.survey.name.,"Point and line graph showing the assessment model fit, displayed as a line, to input catch per unit effort index values, displayed as points over time, for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.abun.start.year to mod.fit.abun.end.year . The y axis shows catch per unit effort in cpue.units, which spans from cpue.min to cpue.max." From 93a988aa8b340b431609cb3d5c5266d38ea55b44 Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 11:24:10 -0500 Subject: [PATCH 05/10] Replace spawning.biomass, recruitment.deviations, natural.mortality, landings, and recruitment with full names of plots for labels (spawning_biomass, recruitment_deviations, natural_mortality, landings, and recruitment, respectively) --- R/plot_landings.R | 3 ++- R/plot_natural_mortality.R | 3 ++- R/plot_recruitment.R | 3 ++- R/plot_recruitment_deviations.R | 3 ++- R/plot_spawning_biomass.R | 2 +- R/utils_rda.R | 4 ++-- inst/resources/captions_alt_text_template.csv | 4 ++-- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/R/plot_landings.R b/R/plot_landings.R index 00680212..b92c5d0f 100644 --- a/R/plot_landings.R +++ b/R/plot_landings.R @@ -101,7 +101,8 @@ plot_landings <- function( if (make_rda) { create_rda( object = plt, - topic_label = "landings", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/plot_natural_mortality.R b/R/plot_natural_mortality.R index 17ee74b2..25d5bf5d 100644 --- a/R/plot_natural_mortality.R +++ b/R/plot_natural_mortality.R @@ -104,7 +104,8 @@ plot_natural_mortality <- function( if (make_rda) { create_rda( object = final, - topic_label = "natural.mortality", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir diff --git a/R/plot_recruitment.R b/R/plot_recruitment.R index 24c4715f..a6de07de 100644 --- a/R/plot_recruitment.R +++ b/R/plot_recruitment.R @@ -146,7 +146,8 @@ plot_recruitment <- function( if (make_rda) { create_rda( object = final, - topic_label = caption_label, + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir # , diff --git a/R/plot_recruitment_deviations.R b/R/plot_recruitment_deviations.R index e7e3744c..acaf86ac 100644 --- a/R/plot_recruitment_deviations.R +++ b/R/plot_recruitment_deviations.R @@ -102,7 +102,8 @@ plot_recruitment_deviations <- function( } create_rda( object = final, - topic_label = "recruitment.deviations", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = selected_dat, dir = figures_dir, diff --git a/R/plot_spawning_biomass.R b/R/plot_spawning_biomass.R index 4fd29179..7d23612d 100644 --- a/R/plot_spawning_biomass.R +++ b/R/plot_spawning_biomass.R @@ -207,7 +207,7 @@ plot_spawning_biomass <- function( if (make_rda) { create_rda( object = final, - topic_label = ifelse(relative, "relative.spawning.biomass", "spawning.biomass"), + topic_label = ifelse(relative, "relative_spawning_biomass", "spawning_biomass"), fig_or_table = "figure", dat = rp_dat, dir = figures_dir, diff --git a/R/utils_rda.R b/R/utils_rda.R index 25c46168..f00ea435 100644 --- a/R/utils_rda.R +++ b/R/utils_rda.R @@ -247,7 +247,7 @@ add_more_key_quants <- function( } ## relative spawning biomass - if (topic_cap_alt$label == "relative.spawning.biomass") { + if (topic_cap_alt$label == "relative_spawning_biomass") { if (is.null(dat)) { cli::cli_alert_warning("Some key quantities associated with relative spawning biomass were not extracted and added to captions_alt_text.csv due to missing data file (i.e., 'dat' argument).", wrap = TRUE) } @@ -318,7 +318,7 @@ add_more_key_quants <- function( } ## spawning biomass - if (topic_cap_alt$label == "spawning.biomass" | topic_cap_alt$label == "sr") { + if (topic_cap_alt$label == "spawning_biomass" | topic_cap_alt$label == "sr") { if (is.null(dat)) { cli::cli_alert_warning("Some key quantities associated with spawning biomass were not extracted and added to captions_alt_text.csv due to missing data file (i.e., 'dat' argument).", wrap = TRUE) } else { diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index a62224fc..e6e26d25 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -5,7 +5,7 @@ relative_biomass,figure,Relative biomass (B) time series. The horizontal dashed fishing_mortality,figure,Fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows fishing mortality in F.units, which spans from F.min to F.max." relative_fishing_mortality,figure,Relative fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows relative fishing mortality (F/F~target~), which spans from rel.F.min to rel.F.max." landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." -natural.mortality,figure,Natural mortality (M) for each age. ,"Line graph showing natural mortality. The x axis shows age in years, which spans from M.age.min to M.age.max. The y axis shows the natural mortality rate per year, which spans from M.rate.min to M.rate.max." +natural_mortality,figure,Natural mortality (M) for each age. ,"Line graph showing natural mortality. The x axis shows age in years, which spans from M.age.min to M.age.max. The y axis shows the natural mortality rate per year, which spans from M.rate.min to M.rate.max." vonb.laa,figure,Aged and measured fish (points) and von Bertalanffy growth function (line) fit to the data.,"Point and line graph showing observations of measured age and length data as points and the von Bertalanffy relationship fit to this data as a line with 95\\% confidence intervals. The x axis shows age in years, which spans from vonb.age.min to vonb.age.max. The y axis shows length in vonb.length.units, which spans from vonb.length.min to vonb.length.max." length.type.conversion,figure,Length-type conversion relationship between total and fork length where points represent individual fish length measurement observations and the line is the fitted relationship.,"Point and line graph showing observations of measured fork length and measured total length from the same fish for conversion purposes as points, and a linear fit through those points as a line. The x axis shows total length in total.length.units, which spans from total.length.min to total.length.max. The y axis shows fork length in fork.length.units, which spans from fork.length.min to fork.length.max." weight.length.converstion,figure,Weight-length conversion relationship where the points represent individual fish observations and the line is the fitted relationship. ,"Point and line graph showing observations of measured length and measured weight from the same fish for conversion purposes as points, and an exponential fit through those points as a line. The x axis shows length in wl.length.units, which spans from wl.length.min to wl.length.max. The y axis shows weight in wl.weight.units, which spans from wl.weight.min to wl.weight.max." @@ -23,7 +23,7 @@ sr,figure,Stock recruitment relationship estimated by the assessment model. ,"Po recruitment,figure,Estimated recruitment by the assessment model each year in recruitment.units.,"Line graph showing the assessment model estimated recruitment in sr.units for each year. The x axis shows years, which spans from recruitment.start.year to recruitment.end.year . The y axis shows recruitment in recruitment.units, which spans from sr.min to sr.max." recruitment.comp,figure,Predicted (black points) and expected (red line) recruitment by the assessment model each year in recruitment.units.,"Scatter plot showing the assessment model estimated recruitment in sr.units for each year with a red line showing the predicted recruitment in sr.units for each year. The x axis shows years, which spans from recruitment.start.year to recruitment.end.year . The y axis shows recruitment in recruitment.units, which spans from sr.min to sr.max." relative.recruitment,figure,"Estimated relative recruitment by the assessment model each year in recruitment.units, calculated as R/R~0~ where R~0~ is R0.","Line graph showing the assessment model estimated relative recruitment in sr.units for each year. The x axis shows year, which spans from recruitment.start.year to recruitment.end.year . The y axis shows relative recruitment (R/R~0~), which spans from rel.recruitment.min to rel.recruitment.max recruitment.units ." -recruitment.deviations,figure,Annual deviations (on natural log scale) in the number of newly recruited fish the model estimates each year. ,"Scatterplot showing annual deviations in recruitment. Points have error bars and the dashed horizontal line at 0 represents no deviation from what would be estimated by the stock-recruit relationship. Positive values represent an increase in recruitment that year while negative values represent a decrease. The x axis shows year, which spans from recruit.dev.start.year to recruit.dev.end.year . The y axis shows the recruitment deviation, which spans from recruit.dev.min to recruit.dev.max on a natural log scale." +recruitment_deviations,figure,Annual deviations (on natural log scale) in the number of newly recruited fish the model estimates each year. ,"Scatterplot showing annual deviations in recruitment. Points have error bars and the dashed horizontal line at 0 represents no deviation from what would be estimated by the stock-recruit relationship. Positive values represent an increase in recruitment that year while negative values represent a decrease. The x axis shows year, which spans from recruit.dev.start.year to recruit.dev.end.year . The y axis shows the recruitment deviation, which spans from recruit.dev.min to recruit.dev.max on a natural log scale." tot.b,figure,Estimated biomass (B) time series. The horizontal dashed line represents the biomass limit reference point at B.ref.pt B.units.,"Line graph showing estimated biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows estimated biomass in B.units, which spans from B.min to B.max." spawning.biomass,figure,Estimated spawning stock biomass (SSB) time series. The horizontal dashed line represents the spawning stock biomass associated with the biomass limit reference point (ssb.ref.pt ssb.units).,"Line graph showing estimated spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated spawning stock biomass in ssb.units, which spans from ssb.min to ssb.max." relative.spawning.biomass,figure,Estimated relative spawning stock biomass time series. The horizontal dashed line represents the limit reference point calculated as SSB/SSB(reference point) (ssb.ref.pt ssb.units).,"Line graph showing estimated relative spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated relative spawning stock biomass (SSB/SSB~target~), which spans from rel.ssb.min to rel.ssb.max ssb.units." From d8b2bb259a8f08fe8d4b810516c7d45727802b47 Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 11:48:44 -0500 Subject: [PATCH 06/10] Replace sr, indices figure and table, landings figure and table, and bnc table with full names of plots for labels (stock_recruitment, plot_indices, table_indices, plot_landings, table_landings, bnc, respectively) --- R/plot_indices.R | 5 +++-- R/plot_landings.R | 5 +++-- R/plot_stock_recruitment.R | 3 ++- R/table_bnc.R | 5 +++-- R/table_indices.R | 16 +++++++++------- R/table_landings.R | 4 +++- R/utils_rda.R | 4 ++-- inst/resources/captions_alt_text_template.csv | 10 +++++----- 8 files changed, 30 insertions(+), 22 deletions(-) diff --git a/R/plot_indices.R b/R/plot_indices.R index 542216a8..e2336a7f 100644 --- a/R/plot_indices.R +++ b/R/plot_indices.R @@ -116,8 +116,9 @@ plot_indices <- function( if (make_rda) { create_rda( object = plt, - # get name of function and remove "plot_" from it - topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), + # get entire name of function (don't remove "plot_" from it) to + # distinguish with table_indices() + topic_label = as.character(sys.call()[[1]]), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/plot_landings.R b/R/plot_landings.R index b92c5d0f..5ae092a0 100644 --- a/R/plot_landings.R +++ b/R/plot_landings.R @@ -101,8 +101,9 @@ plot_landings <- function( if (make_rda) { create_rda( object = plt, - # get name of function and remove "plot_" from it - topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), + # get entire name of function (don't remove "plot_" from it) to + # distinguish with table_landings() + topic_label = as.character(sys.call()[[1]]), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/plot_stock_recruitment.R b/R/plot_stock_recruitment.R index 086f5406..8a9ea0b7 100644 --- a/R/plot_stock_recruitment.R +++ b/R/plot_stock_recruitment.R @@ -129,7 +129,8 @@ plot_stock_recruitment <- function( if (make_rda) { create_rda( object = final, - topic_label = "sr", + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir # , diff --git a/R/table_bnc.R b/R/table_bnc.R index 535eb555..0881d1a7 100644 --- a/R/table_bnc.R +++ b/R/table_bnc.R @@ -179,12 +179,13 @@ # fig_or_table = fig_or_table, # dir = tables_dir # ) - +# # export_rda( # object = final, # caps_alttext = caps_alttext, # figures_tables_dir = tables_dir, -# topic_label = topic_label, +# # get name of function and remove "table_" from it +# topic_label = gsub("table_", "", as.character(sys.call()[[1]])), # fig_or_table = fig_or_table # ) # } diff --git a/R/table_indices.R b/R/table_indices.R index 7faa1d4e..8cff60ad 100644 --- a/R/table_indices.R +++ b/R/table_indices.R @@ -155,13 +155,15 @@ # ) -# export_rda( -# object = final, -# caps_alttext = caps_alttext, -# figures_tables_dir = tables_dir, -# topic_label = topic_label, -# fig_or_table = fig_or_table -# ) + # export_rda( + # object = final, + # caps_alttext = caps_alttext, + # figures_tables_dir = tables_dir, + # # get entire name of function (don't remove "plot_" from it) to + # # distinguish with table_indices() + # topic_label = as.character(sys.call()[[1]]), + # fig_or_table = fig_or_table + # ) # } # final # } diff --git a/R/table_landings.R b/R/table_landings.R index 2d6a3bf6..fad9a187 100644 --- a/R/table_landings.R +++ b/R/table_landings.R @@ -114,7 +114,9 @@ table_landings <- function( if (length(df_list) == 1) { create_rda( object = final$label, - topic_label = "landings", + # get entire name of function (don't remove "table_" from it) to + # distinguish with plot_landings() + topic_label = as.character(sys.call()[[1]]), fig_or_table = "table", dat = dat, dir = tables_dir, diff --git a/R/utils_rda.R b/R/utils_rda.R index f00ea435..c4734827 100644 --- a/R/utils_rda.R +++ b/R/utils_rda.R @@ -318,7 +318,7 @@ add_more_key_quants <- function( } ## spawning biomass - if (topic_cap_alt$label == "spawning_biomass" | topic_cap_alt$label == "sr") { + if (topic_cap_alt$label == "spawning_biomass" | topic_cap_alt$label == "stock_recruitment") { if (is.null(dat)) { cli::cli_alert_warning("Some key quantities associated with spawning biomass were not extracted and added to captions_alt_text.csv due to missing data file (i.e., 'dat' argument).", wrap = TRUE) } else { @@ -423,7 +423,7 @@ add_more_key_quants <- function( } ## recruitment - if (topic_cap_alt$label == "recruitment" | topic_cap_alt$label == "sr") { + if (topic_cap_alt$label == "recruitment" | topic_cap_alt$label == "stock_recruitment") { if (is.null(dat)) { cli::cli_alert_warning("Some key quantities associated with recruitment were not extracted and added to captions_alt_text.csv due to missing data file (i.e., 'dat' argument).", wrap = TRUE) } else { diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index e6e26d25..bdba11ed 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -4,7 +4,7 @@ biomass,figure,Biomass (B) time series. The horizontal dashed line represents th relative_biomass,figure,Relative biomass (B) time series. The horizontal dashed line represents the limit reference point calculated as B/B(reference point) (B.ref.point B.units).,"Line graph showing relative biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows relative biomass (B/B~target~), which spans from rel.B.min to rel.B.max B.units ." fishing_mortality,figure,Fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows fishing mortality in F.units, which spans from F.min to F.max." relative_fishing_mortality,figure,Relative fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows relative fishing mortality (F/F~target~), which spans from rel.F.min to rel.F.max." -landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." +plot_landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." natural_mortality,figure,Natural mortality (M) for each age. ,"Line graph showing natural mortality. The x axis shows age in years, which spans from M.age.min to M.age.max. The y axis shows the natural mortality rate per year, which spans from M.rate.min to M.rate.max." vonb.laa,figure,Aged and measured fish (points) and von Bertalanffy growth function (line) fit to the data.,"Point and line graph showing observations of measured age and length data as points and the von Bertalanffy relationship fit to this data as a line with 95\\% confidence intervals. The x axis shows age in years, which spans from vonb.age.min to vonb.age.max. The y axis shows length in vonb.length.units, which spans from vonb.length.min to vonb.length.max." length.type.conversion,figure,Length-type conversion relationship between total and fork length where points represent individual fish length measurement observations and the line is the fitted relationship.,"Point and line graph showing observations of measured fork length and measured total length from the same fish for conversion purposes as points, and a linear fit through those points as a line. The x axis shows total length in total.length.units, which spans from total.length.min to total.length.max. The y axis shows fork length in fork.length.units, which spans from fork.length.min to fork.length.max." @@ -13,13 +13,13 @@ maturity.schedule,figure,The relationship between the proportion mature and fish fecundity.at.length,figure,Fecundity (in number of eggs) as a function of fish length. ,"Point and line graph showing observations of measured fecundity and measured length from the same fish and an exponential fit through those points displayed as a line. The x axis shows length in fecundity.length.units, which spans from fecundity.length.min to fecundity.length.max. The y axis shows fecundity in fecundity.units, which spans from fecundity.min to fecundity.max." catch,figure,"Historical catch for each year in which there is composition data, for each fleet or survey.","Cumulative area plot showing the catch for each year and fleet or survey. The x axis shows the year, which spans from catch.year.min to catch.year.max. The y axis shows the proportion of the total catch by each fleet or survey and spans from tot.catch.min to tot.catch.max." CAL,figure,"Histograms showing the proportion of the catch in each length group, each year for which there is composition data, for fleet or survey fleet.or.survey.name.","Histograms for each year and fleet for which there is data (one per year grouped by fleet or survey), which show the proportion of the catch in each length group. The x axis of each histogram contains length intervals, which span from cal.length.min to cal.length.max. The y axis of each histogram contains the proportion of the catch and spans from 0--1." -indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." +figure_indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." abundance_at_age,figure,Model estimate of population numbers at age over time. The relative size of each bubble for a given year and age indicates the relative abundance in that category compared with others. ,"Bubble plot showing relative age proportions over time. The x axis shows the year, which spans from pop.naa.start.year to pop.naa.end.year . The y axis shows age in years, which spans from pop.naa.age.min to pop.naa.age.max. The size of the bubbles range from pop.naa.fish.min to pop.naa.fish.max." mod.fit.catch,figure,Observed catch from the data input file (points) and model estimated catch (line) over time for fleet.or.survey.name. ,"Point and line graph showing observed catch from the data input file as points and model estimated catch as a line over time for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.catch.start.year to mod.fit.catch.end.year . The y axis shows catch in mod.fit.catch.units, which spans from mod.fit.catch.min to mod.fit.catch.max." mod.fit.abun,figure,Assessment model fits to input catch per unit of effort index values over time calculated from fleet.or.survey.name.,"Point and line graph showing the assessment model fit, displayed as a line, to input catch per unit effort index values, displayed as points over time, for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.abun.start.year to mod.fit.abun.end.year . The y axis shows catch per unit effort in cpue.units, which spans from cpue.min to cpue.max." mod.fit.discards,figure,Observed discards (points) and estimated discards (line).,"Point and line graph showing the assessment model fit to observed discards. Observed discards are represented as points while the model fitted estimates are represented as a line over time for fleet.or.survey.name. The x axis shows the year, which spans from mod.fit.discards.start.year to mod.fit.discards.end.year . The y axis shows discards in mod.fit.discards.units, which spans from mod.fit.discards.min to mod.fit.discards.max." selectivity,figure,Length-based selectivity for each fleet and survey estimated by the assessment model.,"Line graph showing length-based selectivity for fleet.or.survey.name from selectivity.start.year to selectivity.end.year . The x axis shows length in selectivity.length.units, which spans from selectivity.length.min to selectivity.length.max. The y axis shows the proportion of the stock that the gear selects for, which spans from 0--1." -sr,figure,Stock recruitment relationship estimated by the assessment model. ,"Point and line graph showing the relationship between stock biomass and newly recruited sr.age.min fish as estimated by the assessment model. Points represent model estimates of recruitment each year as a function of stock biomass, after adjusted by annual recruitment deviations. The line represents the best fit through the points for the stock relationship selected for use in the assessment model. The x axis shows spawning stock biomass in sr.ssb.units, which spans from sr.ssb.min to sr.ssb.max. The y axis shows recruitment in sr.units, which spans from sr.min to sr.max." +stock_recruitment,figure,Stock recruitment relationship estimated by the assessment model. ,"Point and line graph showing the relationship between stock biomass and newly recruited sr.age.min fish as estimated by the assessment model. Points represent model estimates of recruitment each year as a function of stock biomass, after adjusted by annual recruitment deviations. The line represents the best fit through the points for the stock relationship selected for use in the assessment model. The x axis shows spawning stock biomass in sr.ssb.units, which spans from sr.ssb.min to sr.ssb.max. The y axis shows recruitment in sr.units, which spans from sr.min to sr.max." recruitment,figure,Estimated recruitment by the assessment model each year in recruitment.units.,"Line graph showing the assessment model estimated recruitment in sr.units for each year. The x axis shows years, which spans from recruitment.start.year to recruitment.end.year . The y axis shows recruitment in recruitment.units, which spans from sr.min to sr.max." recruitment.comp,figure,Predicted (black points) and expected (red line) recruitment by the assessment model each year in recruitment.units.,"Scatter plot showing the assessment model estimated recruitment in sr.units for each year with a red line showing the predicted recruitment in sr.units for each year. The x axis shows years, which spans from recruitment.start.year to recruitment.end.year . The y axis shows recruitment in recruitment.units, which spans from sr.min to sr.max." relative.recruitment,figure,"Estimated relative recruitment by the assessment model each year in recruitment.units, calculated as R/R~0~ where R~0~ is R0.","Line graph showing the assessment model estimated relative recruitment in sr.units for each year. The x axis shows year, which spans from recruitment.start.year to recruitment.end.year . The y axis shows relative recruitment (R/R~0~), which spans from rel.recruitment.min to rel.recruitment.max recruitment.units ." @@ -35,10 +35,10 @@ report.version.model.changes,table,Document version history briefly describing w projection.ts,table,Forecasted catch and biomass over future years for different fishing mortality scenarios. , catch,table,Observed (points) and model estimated (line) catch over time for fleet catch.fleet., life.history.params,table,Life history parameters used in the stock assessment model. The last column of the table indicates whether the parameters were estimated by the model or fixed., -landings,table,Landed catch by fleet and year in landings.units., +table_landings,table,Landed catch by fleet and year in landings.units., discards,table,Discarded catch by fleet and year in discards.tbl.units., age.length.key,table,Age-length key: the proportion of fish for each age that belong to a particular length group. , -indices.abundance,table,Calculated indices of abundance and their corresponding CVs for the fleets and surveys identified in the column headers. , +table_indices,table,Calculated indices of abundance and their corresponding CVs for the fleets and surveys identified in the column headers. , model.runs,table,"The base configuration and alternative sensitivity analysis configurations of the stock assessment model, in which parameters and/or data input streams are changed from one configuration to another.", derived.quantities,table,Derived quantities calculated by the base configuration of the stock assessment model., est.params,table,Parameters used in the base stock assessment model and whether the parameter was estimated by the model or fixed (i.e. not allowed to be estimated or changed by the model). CVs for estimated models are provided., From 3fc7c21dcc5cd17aaf9736859931bf921055c3f5 Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 12:13:02 -0500 Subject: [PATCH 07/10] Edit indices and landings figs/tables to give identical labels again, since it shouldn't cause an issue downstream --- R/plot_indices.R | 5 ++--- R/plot_landings.R | 5 ++--- R/table_indices.R | 5 ++--- R/table_landings.R | 5 ++--- R/utils_rda.R | 4 ++++ inst/resources/captions_alt_text_template.csv | 8 ++++---- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/R/plot_indices.R b/R/plot_indices.R index e2336a7f..2f2040d4 100644 --- a/R/plot_indices.R +++ b/R/plot_indices.R @@ -116,9 +116,8 @@ plot_indices <- function( if (make_rda) { create_rda( object = plt, - # get entire name of function (don't remove "plot_" from it) to - # distinguish with table_indices() - topic_label = as.character(sys.call()[[1]]), + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/plot_landings.R b/R/plot_landings.R index 5ae092a0..04dec696 100644 --- a/R/plot_landings.R +++ b/R/plot_landings.R @@ -101,9 +101,8 @@ plot_landings <- function( if (make_rda) { create_rda( object = plt, - # get entire name of function (don't remove "plot_" from it) to - # distinguish with table_landings() - topic_label = as.character(sys.call()[[1]]), + # get name of function and remove "plot_" from it + topic_label = gsub("plot_", "", as.character(sys.call()[[1]])), fig_or_table = "figure", dat = dat, dir = figures_dir, diff --git a/R/table_indices.R b/R/table_indices.R index 8cff60ad..fe2d58c7 100644 --- a/R/table_indices.R +++ b/R/table_indices.R @@ -159,9 +159,8 @@ # object = final, # caps_alttext = caps_alttext, # figures_tables_dir = tables_dir, - # # get entire name of function (don't remove "plot_" from it) to - # # distinguish with table_indices() - # topic_label = as.character(sys.call()[[1]]), + # # get name of function and remove "table_" from it + # topic_label = gsub("table_", "", as.character(sys.call()[[1]])), # fig_or_table = fig_or_table # ) # } diff --git a/R/table_landings.R b/R/table_landings.R index fad9a187..0438227e 100644 --- a/R/table_landings.R +++ b/R/table_landings.R @@ -114,9 +114,8 @@ table_landings <- function( if (length(df_list) == 1) { create_rda( object = final$label, - # get entire name of function (don't remove "table_" from it) to - # distinguish with plot_landings() - topic_label = as.character(sys.call()[[1]]), + # get name of function and remove "table_" from it + topic_label = gsub("table_", "", as.character(sys.call()[[1]])), fig_or_table = "table", dat = dat, dir = tables_dir, diff --git a/R/utils_rda.R b/R/utils_rda.R index c4734827..dadddb23 100644 --- a/R/utils_rda.R +++ b/R/utils_rda.R @@ -195,6 +195,10 @@ add_more_key_quants <- function( # write analogous code for each in this section, and remove placeholders from # the end of write_captions (once we get clarity about how to extract Btarg, # ssbtarg, and R0) + # + + #TODO: When adding code extracting values for landings and/or indices figures/tables, be aware that both figure/table share the same label ("landings" and "indices"). If there's reason, add in extra conditional to check if value is from a figure or table + ## biomass if (topic_cap_alt$label == "biomass") { if (is.null(dat)) { diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index bdba11ed..0fa4c8b9 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -4,7 +4,7 @@ biomass,figure,Biomass (B) time series. The horizontal dashed line represents th relative_biomass,figure,Relative biomass (B) time series. The horizontal dashed line represents the limit reference point calculated as B/B(reference point) (B.ref.point B.units).,"Line graph showing relative biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows relative biomass (B/B~target~), which spans from rel.B.min to rel.B.max B.units ." fishing_mortality,figure,Fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows fishing mortality in F.units, which spans from F.min to F.max." relative_fishing_mortality,figure,Relative fishing mortality (F) over time. The horizontal dashed line represents the target reference point (F.ref.pt).,"Line graph showing fishing mortality over time . The x axis shows the year, which spans from F.start.year to F.end.year . The y axis shows relative fishing mortality (F/F~target~), which spans from rel.F.min to rel.F.max." -plot_landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." +landings,figure,Historical landings by fleet.,"Cumulative area plot showing historical landings. The x axis shows the year, which spans from landings.start.year to landings.end.year . The y axis shows landings in landings.units, which spans from landings.min to landings.max." natural_mortality,figure,Natural mortality (M) for each age. ,"Line graph showing natural mortality. The x axis shows age in years, which spans from M.age.min to M.age.max. The y axis shows the natural mortality rate per year, which spans from M.rate.min to M.rate.max." vonb.laa,figure,Aged and measured fish (points) and von Bertalanffy growth function (line) fit to the data.,"Point and line graph showing observations of measured age and length data as points and the von Bertalanffy relationship fit to this data as a line with 95\\% confidence intervals. The x axis shows age in years, which spans from vonb.age.min to vonb.age.max. The y axis shows length in vonb.length.units, which spans from vonb.length.min to vonb.length.max." length.type.conversion,figure,Length-type conversion relationship between total and fork length where points represent individual fish length measurement observations and the line is the fitted relationship.,"Point and line graph showing observations of measured fork length and measured total length from the same fish for conversion purposes as points, and a linear fit through those points as a line. The x axis shows total length in total.length.units, which spans from total.length.min to total.length.max. The y axis shows fork length in fork.length.units, which spans from fork.length.min to fork.length.max." @@ -13,7 +13,7 @@ maturity.schedule,figure,The relationship between the proportion mature and fish fecundity.at.length,figure,Fecundity (in number of eggs) as a function of fish length. ,"Point and line graph showing observations of measured fecundity and measured length from the same fish and an exponential fit through those points displayed as a line. The x axis shows length in fecundity.length.units, which spans from fecundity.length.min to fecundity.length.max. The y axis shows fecundity in fecundity.units, which spans from fecundity.min to fecundity.max." catch,figure,"Historical catch for each year in which there is composition data, for each fleet or survey.","Cumulative area plot showing the catch for each year and fleet or survey. The x axis shows the year, which spans from catch.year.min to catch.year.max. The y axis shows the proportion of the total catch by each fleet or survey and spans from tot.catch.min to tot.catch.max." CAL,figure,"Histograms showing the proportion of the catch in each length group, each year for which there is composition data, for fleet or survey fleet.or.survey.name.","Histograms for each year and fleet for which there is data (one per year grouped by fleet or survey), which show the proportion of the catch in each length group. The x axis of each histogram contains length intervals, which span from cal.length.min to cal.length.max. The y axis of each histogram contains the proportion of the catch and spans from 0--1." -figure_indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." +indices,figure,Catch per unit effort (CPUE) over time for fleet or survey. 95\\% confidence intervals are shown for each survey/fleet.,"Line graph showing catch per unit effort (CPUE) over time, stratified by survey/fleet. The x axis shows the year, which spans from cpue.start.year to cpue.end.year . The y axis shows CPUE in cpue.units, which spans from cpue.min to cpue.max." abundance_at_age,figure,Model estimate of population numbers at age over time. The relative size of each bubble for a given year and age indicates the relative abundance in that category compared with others. ,"Bubble plot showing relative age proportions over time. The x axis shows the year, which spans from pop.naa.start.year to pop.naa.end.year . The y axis shows age in years, which spans from pop.naa.age.min to pop.naa.age.max. The size of the bubbles range from pop.naa.fish.min to pop.naa.fish.max." mod.fit.catch,figure,Observed catch from the data input file (points) and model estimated catch (line) over time for fleet.or.survey.name. ,"Point and line graph showing observed catch from the data input file as points and model estimated catch as a line over time for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.catch.start.year to mod.fit.catch.end.year . The y axis shows catch in mod.fit.catch.units, which spans from mod.fit.catch.min to mod.fit.catch.max." mod.fit.abun,figure,Assessment model fits to input catch per unit of effort index values over time calculated from fleet.or.survey.name.,"Point and line graph showing the assessment model fit, displayed as a line, to input catch per unit effort index values, displayed as points over time, for fleet.or.survey.name. The x axis shows years, which spans from mod.fit.abun.start.year to mod.fit.abun.end.year . The y axis shows catch per unit effort in cpue.units, which spans from cpue.min to cpue.max." @@ -35,10 +35,10 @@ report.version.model.changes,table,Document version history briefly describing w projection.ts,table,Forecasted catch and biomass over future years for different fishing mortality scenarios. , catch,table,Observed (points) and model estimated (line) catch over time for fleet catch.fleet., life.history.params,table,Life history parameters used in the stock assessment model. The last column of the table indicates whether the parameters were estimated by the model or fixed., -table_landings,table,Landed catch by fleet and year in landings.units., +landings,table,Landed catch by fleet and year in landings.units., discards,table,Discarded catch by fleet and year in discards.tbl.units., age.length.key,table,Age-length key: the proportion of fish for each age that belong to a particular length group. , -table_indices,table,Calculated indices of abundance and their corresponding CVs for the fleets and surveys identified in the column headers. , +indices,table,Calculated indices of abundance and their corresponding CVs for the fleets and surveys identified in the column headers. , model.runs,table,"The base configuration and alternative sensitivity analysis configurations of the stock assessment model, in which parameters and/or data input streams are changed from one configuration to another.", derived.quantities,table,Derived quantities calculated by the base configuration of the stock assessment model., est.params,table,Parameters used in the base stock assessment model and whether the parameter was estimated by the model or fixed (i.e. not allowed to be estimated or changed by the model). CVs for estimated models are provided., From 01ab36e8bd7957163f639ffadaec8e22307c23ab Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 12:49:43 -0500 Subject: [PATCH 08/10] Fix spawning biomass label in template alt text/captions csv --- inst/resources/captions_alt_text_template.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/resources/captions_alt_text_template.csv b/inst/resources/captions_alt_text_template.csv index 0fa4c8b9..d5ea858c 100644 --- a/inst/resources/captions_alt_text_template.csv +++ b/inst/resources/captions_alt_text_template.csv @@ -25,7 +25,7 @@ recruitment.comp,figure,Predicted (black points) and expected (red line) recruit relative.recruitment,figure,"Estimated relative recruitment by the assessment model each year in recruitment.units, calculated as R/R~0~ where R~0~ is R0.","Line graph showing the assessment model estimated relative recruitment in sr.units for each year. The x axis shows year, which spans from recruitment.start.year to recruitment.end.year . The y axis shows relative recruitment (R/R~0~), which spans from rel.recruitment.min to rel.recruitment.max recruitment.units ." recruitment_deviations,figure,Annual deviations (on natural log scale) in the number of newly recruited fish the model estimates each year. ,"Scatterplot showing annual deviations in recruitment. Points have error bars and the dashed horizontal line at 0 represents no deviation from what would be estimated by the stock-recruit relationship. Positive values represent an increase in recruitment that year while negative values represent a decrease. The x axis shows year, which spans from recruit.dev.start.year to recruit.dev.end.year . The y axis shows the recruitment deviation, which spans from recruit.dev.min to recruit.dev.max on a natural log scale." tot.b,figure,Estimated biomass (B) time series. The horizontal dashed line represents the biomass limit reference point at B.ref.pt B.units.,"Line graph showing estimated biomass time series. The x axis shows the year, which spans from B.start.year to B.end.year . The y axis shows estimated biomass in B.units, which spans from B.min to B.max." -spawning.biomass,figure,Estimated spawning stock biomass (SSB) time series. The horizontal dashed line represents the spawning stock biomass associated with the biomass limit reference point (ssb.ref.pt ssb.units).,"Line graph showing estimated spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated spawning stock biomass in ssb.units, which spans from ssb.min to ssb.max." +spawning_biomass,figure,Estimated spawning stock biomass (SSB) time series. The horizontal dashed line represents the spawning stock biomass associated with the biomass limit reference point (ssb.ref.pt ssb.units).,"Line graph showing estimated spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated spawning stock biomass in ssb.units, which spans from ssb.min to ssb.max." relative.spawning.biomass,figure,Estimated relative spawning stock biomass time series. The horizontal dashed line represents the limit reference point calculated as SSB/SSB(reference point) (ssb.ref.pt ssb.units).,"Line graph showing estimated relative spawning stock biomass. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated relative spawning stock biomass (SSB/SSB~target~), which spans from rel.ssb.min to rel.ssb.max ssb.units." spr,figure,Estimated spawning potential ratio (SPR) (SSB~current~/SSB~target~) time series. The horizontal dashed line represents the spawning potential ratio of the limit reference point at spr.ref.pt.,"Line graph showing estimated spawning potential ratio over time. The x axis shows the year, which spans from ssb.start.year to ssb.end.year . The y axis shows estimated spawning potential ratio in SSB~current~/SSB~target~, which spans from spr.min to spr.max." biomass_at_age,figure,Estimated population numbers at age and population biomass at age over time. The relative size of each bubble for a given year and age indicates the relative abundance or biomass in that category compared with others. ,"Bubble plot showing estimated population numbers at age and population biomass at age. The x axis shows the year, which spans from pop.baa.start.year to pop.baa.end.year . The y axis shows age, which spans from pop.baa.age.min to pop.baa.age.max. The size of the bubbles range from pop.baa.fish.min to pop.baa.fish.max." From e499e42a79dc74ccff4bcaff1a854582362457f8 Mon Sep 17 00:00:00 2001 From: sbreitbart-NOAA Date: Mon, 2 Mar 2026 13:06:06 -0500 Subject: [PATCH 09/10] Update tests --- .../Hake_2018/std_output.rda | Bin 136099 -> 136105 bytes tests/testthat/test-plot_abundance_at_age.R | 4 +- tests/testthat/test-plot_biomass_at_age.R | 4 +- tests/testthat/test-plot_catch_comp.R | 4 +- tests/testthat/test-plot_natural_mortality.R | 4 +- .../test-plot_recruitment_deviations.R | 4 +- tests/testthat/test-plot_spawning_biomass.R | 4 +- tests/testthat/test-plot_stock_recruitment.R | 2 +- tests/testthat/test-save_all_plots.R | 40 +++++++++--------- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/tests/testthat/fixtures/ss3_models_converted/Hake_2018/std_output.rda b/tests/testthat/fixtures/ss3_models_converted/Hake_2018/std_output.rda index 0b2e9206b0ce6d69cc2e3849ea9daae4728d7b63..cd52a36f02aa4d4ccf6b99744261f9a5a464e8a2 100644 GIT binary patch literal 136105 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]_9pc9-NJm^6S6A4(g!lFnrffzG}640s=P4< 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

EjJNN36vU?1@Gz}opBg_3WD6dk%!#i` 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

6f$r^0d2iwVXpKf{5SNhHB8WFMt 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