From 14f18298ca80d15f620a1dd375960d61889681dc Mon Sep 17 00:00:00 2001 From: Zoe Gibney Date: Wed, 29 Apr 2026 11:45:18 +0100 Subject: [PATCH 1/2] Adding pine countries to constants for impact plotting key countries --- R/constants.R | 8 ++++++++ man/constants.Rd | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/R/constants.R b/R/constants.R index e4c3532..90b4858 100644 --- a/R/constants.R +++ b/R/constants.R @@ -215,3 +215,11 @@ DEF_TOUCHSTONE_OLD_OLD <- "202110" #' #' @export COLOUR_VIMC <- "#008080" + +#' @name constants +#' +#' @examples +#' pine +#' +#' @export +pine <- c("PAK", "IND", "NGA", "ETH") \ No newline at end of file diff --git a/man/constants.Rd b/man/constants.Rd index 1d93a1f..9e08393 100644 --- a/man/constants.Rd +++ b/man/constants.Rd @@ -22,6 +22,7 @@ \alias{DEF_TOUCHSTONE_NEW} \alias{DEF_TOUCHSTONE_OLD_OLD} \alias{COLOUR_VIMC} +\alias{pine} \title{Package constants} \format{ An object of class \code{character} of length 5. @@ -61,6 +62,8 @@ An object of class \code{character} of length 1. An object of class \code{character} of length 1. An object of class \code{character} of length 1. + +An object of class \code{character} of length 4. } \usage{ file_dict_colnames @@ -100,6 +103,8 @@ DEF_TOUCHSTONE_NEW DEF_TOUCHSTONE_OLD_OLD COLOUR_VIMC + +pine } \description{ Constant values used in \emph{vimcheck}. See the \strong{Examples} section for the @@ -144,6 +149,8 @@ DEF_TOUCHSTONE_OLD_OLD COLOUR_VIMC +pine + } \keyword{constants} \keyword{datasets} From 0d446cd7b230138409f611b2017f5ad82150b51a Mon Sep 17 00:00:00 2001 From: Zoe Gibney Date: Wed, 29 Apr 2026 11:45:40 +0100 Subject: [PATCH 2/2] Adding plotting functions from rapid-model-run-impact report which plots central impact estimates, coverage and fvps. Associated documentation also added from attempts at roxygen! --- R/fn_plotting_impact.R | 240 ++++++++++++++++++++++++++++++++++++++ man/plot_coverage_fvps.Rd | 29 +++++ man/plot_impact.Rd | 35 ++++++ 3 files changed, 304 insertions(+) create mode 100644 R/fn_plotting_impact.R create mode 100644 man/plot_coverage_fvps.Rd create mode 100644 man/plot_impact.Rd diff --git a/R/fn_plotting_impact.R b/R/fn_plotting_impact.R new file mode 100644 index 0000000..c66027a --- /dev/null +++ b/R/fn_plotting_impact.R @@ -0,0 +1,240 @@ +#' Plot central impact estimates by cohort and year. +#' TODO: need to add importFrom ... to avoid package issues with testing? +#' +#' Produces faceted plots of central impact estimates for priority countries, +#' stratified either by birth cohort or by year of vaccination. +#' Impact metrics include cases, deaths, DALYs, and YLLs. +#' +#' @param data A tibble containing impact estimates. +#' @param burden_type Burden metric used to evaluate impact. burden_type can be: cases, deaths, dalys, yll. +#' @param title Title of the plot to be rendered +#' @param view Charactar scalar. The way impact is assigned, either by birth cohort ("cohort") or by year of vaccination ("year"). +#' +#' @return ggplot object showing central impact estimates +#' +#' @examples +#' plot_impact( +#' data = impact_data, +#' burden_type = "cases", +#' title = "Cases averted", +#' view = "year" +#' ) +#' +#' @export +plot_impact <- function( + data, + burden_type, + title, + view +){ + checkmate::assert_tibble(data, min.rows = 1L, min.cols = 1L) + checkmate::assert_character(burden_type, len = 1) + checkmate::assert_character(title, len = 1) + + checkmate::assert_choice( + burden_type, + choices = c("cases", "deaths", "dalys", "yll") + ) + + checkmate::assert_choice( + view, + choices = c("cohort", "year") + ) + + Impact <- + data %>% + dplyr::filter(.data$country %in% pine) %>% + dplyr::filter( + .data$burden_outcome == burden_type & .data$impact != 0) #%>% + if(nrow(Impact) > 0){ +# ---- Cohort view ---- + if(view == "cohort"){ + Impact <- Impact %>% dplyr::rename(cohort = .data$birth_cohort) %>% + dplyr::select( + .data$country, + .data$cohort, + .data$impact, + .data$short_name + ) + p <- ggplot( + Impact, + aes( + x = .data$cohort, + y = .data$impact, + ymin = .data$impact, + ymax = .data$impact, + fill = as.character(.data$short_name) + ) + ) + + ggplot::geom_ribbon(alpha = 0.3) + + ggplot::geom_line(aes(colour = .data$short_name), size = 0.5)+ + ggplot::geom_point(aes(colour = .data$short_name), size = 0.5)+ + theme_vimc() + #TODO: to check where the theme definition is saved as may not be right for this plot + facet_wrap(country~., scales = "free_y") + + labs( + x = "Birth cohort", + y = paste(burden_type, "averted"), + title = title + ) + + theme( + legend.position="bottom", + legend.key.size= unit(0.5, 'cm'), + legend.key.width = unit(0.3, 'cm') + ) + + } else { # ---- Year (non-cohort) view ---- + Impact <- Impact %>% + dplyr::select( + .data$country, + .data$year, + .data$impact, + .data$short_name + ) + + p <- ggplot ( + Impact, + aes( + x = .data$year, + y = .data$impact, + ymin = .data$impact, + ymax = .data$impact, + fill = .data$short_name + ) + ) + + ggplot::geom_ribbon(alpha = 0.3)+ + ggplot::geom_line(aes(colour = .data$short_name), size = 0.5)+ + ggplot::geom_point(aes(colour = .data$short_name), size = 0.5)+ + theme_vimc() + #TODO: same note as above re theme definition + facet_wrap(country~., scales = "free_y")+ + labs( + x = "Year", + y = paste(burden_type, "averted"), + title = title + ) + + theme( + legend.position="bottom", + legend.key.size= unit(0.5, 'cm'), + legend.key.width = unit(0.3, 'cm') + ) + } + } else { + p <- "No estimates in the data." #TODO: both here and in the below plot returning p may be an issue? Can you think of a better way? + } + return(p) + +} + +#' Plot coverage and fully vaccinated persons (FVPs) +#' +#' Generates plots of routine vaccine coverage and fully vaccinated +#' persons (FVPs) over time for selected countries. +#' +#' @param fvps A tibble showing the number of fvps (fully vaccinated persons) +#' by country, year and scenario/activity type. +#' +#' @return A named list with two ggplot objects: +#' \describe{ +#' \item{coverage}{A plot of routine vaccine coverage over time.} +#' \item{fvps}{A plot of fully vaccinated persons over time.} +#' } +#' @examples +#' plots <- plot_coverage_fvps(fvps) +#' plots$coverage +#' plots$fvps +#' +#' @export +plot_coverage_fvps <- function(fvps){ + checkmate::assert_tibble(fvps, min.rows = 1L, min.cols = 1L) + + fvps <- fvps %>% + dplyr::filter(.data$country %in% pine) + + cov <- fvps %>% + dplyr::filter(.data$activity_type == "routine") %>% + dplyr::mutate( + vaccine_delivery = paste(.data$scenario_type, .data$vaccine, sep = "_"), + coverage_adjusted = round(.data$coverage_adjusted*100, 2) + ) %>% + dplyr::select( + .data$country, + .data$vaccine_delivery, + .data$year, + .data$coverage_adjusted) %>% + dplyr::rename(coverage = .data$coverage_adjusted) + + fvp <- fvps %>% + dplyr::mutate( + vaccine_delivery = paste(.data$scenario_type, .data$activity_type, sep = "_") + ) %>% + dplyr::select( + .data$country, + .data$vaccine_delivery, + .data$year, + .data$fvps + ) %>% + dplyr::group_by( + .data$country, + .data$vaccine_delivery, + .data$year) %>% + dplyr::summarise( + fvps = round(sum(.data$fvps)/1e6, 2), + .groups = "drop" + ) + if(nrow(cov) > 0){ + p <- ggplot( + cov, + aes( + x = .data$year, + y = .data$coverage, + ymin = 0, + ymax = 1, + fill = .data$vaccine_delivery) + ) + + ggplot::geom_line(aes(colour = .data$vaccine_delivery), size = 0.5) + + theme_vimc() + #TODO: same note as above + facet_wrap(country~., scales = "free_y")+ + labs( + x = "Year", + y = "Coverage (%)", + title = "Routine vaccine coverage" + ) + + theme( + legend.position="bottom", + legend.key.size= unit(0.5, 'cm'), + legend.key.width = unit(0.3, 'cm') +) + + } else { + p <- "There is no routine coverage in the database." + } + + + q <- ggplot( + fvp, + aes( + x = .data$year, + y = .data$fvps, + ymin = .data$fvps, + ymax = .data$fvps, #TODO: min/max both here and above seem to be the same so may be irrelevant to define + fill = .data$vaccine_delivery + ) + ) + + geom_point(aes(colour = .data$vaccine_delivery), size = 0.5) + + theme_vimc()+ #TODO: same note above on theme + facet_wrap(country~., scales = "free_y") + + labs( + x = "Year", + y = "FVPs (in millions)", + title = "FVPs" + ) + + theme( + legend.position="bottom", + legend.key.size = unit(0.5, 'cm'), + legend.key.width = unit(0.3, 'cm') + ) + + return(list( + coverage = p, + fvps = q + )) +} diff --git a/man/plot_coverage_fvps.Rd b/man/plot_coverage_fvps.Rd new file mode 100644 index 0000000..4e389fc --- /dev/null +++ b/man/plot_coverage_fvps.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fn_plotting_impact.R +\name{plot_coverage_fvps} +\alias{plot_coverage_fvps} +\title{Plot coverage and fully vaccinated persons (FVPs)} +\usage{ +plot_coverage_fvps(fvps) +} +\arguments{ +\item{fvps}{A tibble showing the number of fvps (fully vaccinated persons) +by country, year and scenario/activity type.} +} +\value{ +A named list with two ggplot objects: +\describe{ +\item{coverage}{A plot of routine vaccine coverage over time.} +\item{fvps}{A plot of fully vaccinated persons over time.} +} +} +\description{ +Generates plots of routine vaccine coverage and fully vaccinated +persons (FVPs) over time for selected countries. +} +\examples{ +plots <- plot_coverage_fvps(fvps) +plots$coverage +plots$fvps + +} diff --git a/man/plot_impact.Rd b/man/plot_impact.Rd new file mode 100644 index 0000000..ef25df7 --- /dev/null +++ b/man/plot_impact.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fn_plotting_impact.R +\name{plot_impact} +\alias{plot_impact} +\title{Plot central impact estimates by cohort and year. +TODO: need to add importFrom ... to avoid package issues with testing?} +\usage{ +plot_impact(data, burden_type, title, view) +} +\arguments{ +\item{data}{A tibble containing impact estimates.} + +\item{burden_type}{Burden metric used to evaluate impact. burden_type can be: cases, deaths, dalys, yll.} + +\item{title}{Title of the plot to be rendered} + +\item{view}{Charactar scalar. The way impact is assigned, either by birth cohort ("cohort") or by year of vaccination ("year").} +} +\value{ +ggplot object showing central impact estimates +} +\description{ +Produces faceted plots of central impact estimates for priority countries, +stratified either by birth cohort or by year of vaccination. +Impact metrics include cases, deaths, DALYs, and YLLs. +} +\examples{ +plot_impact( + data = impact_data, + burden_type = "cases", + title = "Cases averted", + view = "year" +) + +}