AMR/R/ggplot_sir.R

530 lines
21 KiB
R
Raw Normal View History

2018-08-11 21:30:00 +02:00
# ==================================================================== #
# TITLE: #
2022-10-05 09:12:22 +02:00
# AMR: An R Package for Working with Antimicrobial Resistance Data #
2018-08-11 21:30:00 +02:00
# #
# SOURCE CODE: #
2020-07-08 14:48:06 +02:00
# https://github.com/msberends/AMR #
2018-08-11 21:30:00 +02:00
# #
# PLEASE CITE THIS SOFTWARE AS: #
# Berends MS, Luz CF, Friedrich AW, et al. (2022). #
# AMR: An R Package for Working with Antimicrobial Resistance Data. #
# Journal of Statistical Software, 104(3), 1-31. #
2023-05-27 10:39:22 +02:00
# https://doi.org/10.18637/jss.v104.i03 #
2022-10-05 09:12:22 +02:00
# #
2022-12-27 15:16:15 +01:00
# Developed at the University of Groningen and the University Medical #
# Center Groningen in The Netherlands, in collaboration with many #
# colleagues from around the world, see our website. #
2018-08-11 21:30:00 +02:00
# #
2019-01-02 23:24:07 +01:00
# This R package is free software; you can freely use and distribute #
# it for both personal and commercial purposes under the terms of the #
# GNU General Public License version 2.0 (GNU GPL-2), as published by #
# the Free Software Foundation. #
# We created this package for both routine data analysis and academic #
# research and it was publicly released in the hope that it will be #
# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. #
2020-10-08 11:16:03 +02:00
# #
# Visit our website for the full manual and a complete tutorial about #
# how to conduct AMR data analysis: https://msberends.github.io/AMR/ #
2018-08-11 21:30:00 +02:00
# ==================================================================== #
#' AMR Plots with `ggplot2`
2018-08-11 21:30:00 +02:00
#'
#' Use these functions to create bar plots for AMR data analysis. All functions rely on [ggplot2][ggplot2::ggplot()] functions.
2023-01-21 23:47:20 +01:00
#' @param data a [data.frame] with column(s) of class [`sir`] (see [as.sir()])
#' @param position position adjustment of bars, either `"fill"`, `"stack"` or `"dodge"`
#' @param x variable to show on x axis, either `"antibiotic"` (default) or `"interpretation"` or a grouping variable
#' @param fill variable to categorise using the plots legend, either `"antibiotic"` (default) or `"interpretation"` or a grouping variable
2021-05-12 18:15:03 +02:00
#' @param breaks a [numeric] vector of positions
#' @param limits a [numeric] vector of length two providing limits of the scale, use `NA` to refer to the existing minimum or maximum
#' @param facet variable to split plots by, either `"interpretation"` (default) or `"antibiotic"` or a grouping variable
#' @inheritParams proportion
#' @param nrow (when using `facet`) number of rows
2021-02-26 12:11:29 +01:00
#' @param colours a named vactor with colour to be used for filling. The default colours are colour-blind friendly.
#' @param aesthetics aesthetics to apply the colours to - the default is "fill" but can also be (a combination of) "alpha", "colour", "fill", "linetype", "shape" or "size"
2023-01-21 23:47:20 +01:00
#' @param datalabels show datalabels using [labels_sir_count()]
2018-09-16 22:11:17 +02:00
#' @param datalabels.size size of the datalabels
#' @param datalabels.colour colour of the datalabels
2019-05-31 20:25:57 +02:00
#' @param title text to show as title of the plot
#' @param subtitle text to show as subtitle of the plot
#' @param caption text to show as caption of the plot
#' @param x.title text to show as x axis description
#' @param y.title text to show as y axis description
2023-01-21 23:47:20 +01:00
#' @param ... other arguments passed on to [geom_sir()] or, in case of [scale_sir_colours()], named values to set colours. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. See *Examples*.
2020-12-22 00:51:17 +01:00
#' @details At default, the names of antibiotics will be shown on the plots using [ab_name()]. This can be set with the `translate_ab` argument. See [count_df()].
2018-08-11 21:30:00 +02:00
#'
2022-10-10 15:44:59 +02:00
#' ### The Functions
2023-01-21 23:47:20 +01:00
#' [geom_sir()] will take any variable from the data that has an [`sir`] class (created with [as.sir()]) using [sir_df()] and will plot bars with the percentage S, I, and R. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis.
2018-08-11 21:30:00 +02:00
#'
2023-01-21 23:47:20 +01:00
#' [facet_sir()] creates 2d plots (at default based on S/I/R) using [ggplot2::facet_wrap()].
2018-08-11 21:30:00 +02:00
#'
2020-07-08 14:48:06 +02:00
#' [scale_y_percent()] transforms the y axis to a 0 to 100% range using [ggplot2::scale_y_continuous()].
2018-08-11 21:30:00 +02:00
#'
2023-01-21 23:47:20 +01:00
#' [scale_sir_colours()] sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red.
2018-08-11 21:30:00 +02:00
#'
2023-01-21 23:47:20 +01:00
#' [theme_sir()] is a [ggplot2 theme][[ggplot2::theme()] with minimal distraction.
2018-08-11 21:30:00 +02:00
#'
2023-01-21 23:47:20 +01:00
#' [labels_sir_count()] print datalabels on the bars with percentage and amount of isolates using [ggplot2::geom_text()].
2018-09-16 22:11:17 +02:00
#'
2023-01-21 23:47:20 +01:00
#' [ggplot_sir()] is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (`%>%`). See *Examples*.
#' @rdname ggplot_sir
2018-08-11 21:30:00 +02:00
#' @export
#' @examples
2021-05-24 09:00:11 +02:00
#' \donttest{
2022-08-27 20:49:37 +02:00
#' if (require("ggplot2") && require("dplyr")) {
2020-05-16 20:42:45 +02:00
#' # get antimicrobial results for drugs against a UTI:
#' ggplot(example_isolates %>% select(AMX, NIT, FOS, TMP, CIP)) +
2023-01-21 23:47:20 +01:00
#' geom_sir()
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2020-05-16 20:42:45 +02:00
#' # prettify the plot using some additional functions:
#' df <- example_isolates %>% select(AMX, NIT, FOS, TMP, CIP)
#' ggplot(df) +
2023-01-21 23:47:20 +01:00
#' geom_sir() +
2020-05-16 20:42:45 +02:00
#' scale_y_percent() +
2023-01-21 23:47:20 +01:00
#' scale_sir_colours() +
#' labels_sir_count() +
#' theme_sir()
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2020-05-16 20:42:45 +02:00
#' # or better yet, simplify this using the wrapper function - a single command:
#' example_isolates %>%
#' select(AMX, NIT, FOS, TMP, CIP) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir()
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2020-05-16 20:42:45 +02:00
#' # get only proportions and no counts:
#' example_isolates %>%
#' select(AMX, NIT, FOS, TMP, CIP) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir(datalabels = FALSE)
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2020-12-22 00:51:17 +01:00
#' # add other ggplot2 arguments as you like:
2020-05-16 20:42:45 +02:00
#' example_isolates %>%
#' select(AMX, NIT, FOS, TMP, CIP) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir(
2022-08-28 10:31:50 +02:00
#' width = 0.5,
#' colour = "black",
#' size = 1,
#' linetype = 2,
#' alpha = 0.25
#' )
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
#' # you can alter the colours with colour names:
2020-05-16 20:42:45 +02:00
#' example_isolates %>%
#' select(AMX) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir(colours = c(SI = "yellow"))
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
#' # but you can also use the built-in colour-blind friendly colours for
#' # your plots, where "S" is green, "I" is yellow and "R" is red:
2022-08-28 10:31:50 +02:00
#' data.frame(
#' x = c("Value1", "Value2", "Value3"),
#' y = c(1, 2, 3),
#' z = c("Value4", "Value5", "Value6")
#' ) %>%
#' ggplot() +
#' geom_col(aes(x = x, y = y, fill = z)) +
2023-01-21 23:47:20 +01:00
#' scale_sir_colours(Value4 = "S", Value5 = "I", Value6 = "R")
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2021-05-24 11:01:32 +02:00
#' # resistance of ciprofloxacine per age group
#' example_isolates %>%
#' mutate(first_isolate = first_isolate()) %>%
2022-08-28 10:31:50 +02:00
#' filter(
#' first_isolate == TRUE,
#' mo == as.mo("Escherichia coli")
#' ) %>%
2021-05-24 11:01:32 +02:00
#' # age_groups() is also a function in this AMR package:
#' group_by(age_group = age_groups(age)) %>%
#' select(age_group, CIP) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir(x = "age_group")
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2021-05-24 11:01:32 +02:00
#' # a shorter version which also adjusts data label colours:
#' example_isolates %>%
#' select(AMX, NIT, FOS, TMP, CIP) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir(colours = FALSE)
2022-08-27 20:49:37 +02:00
#' }
#' if (require("ggplot2") && require("dplyr")) {
2021-05-24 11:01:32 +02:00
#' # it also supports groups (don't forget to use the group var on `x` or `facet`):
#' example_isolates %>%
2022-08-28 10:31:50 +02:00
#' filter(mo_is_gram_negative(), ward != "Outpatient") %>%
#' # select only UTI-specific drugs
2022-08-27 20:49:37 +02:00
#' select(ward, AMX, NIT, FOS, TMP, CIP) %>%
#' group_by(ward) %>%
2023-01-21 23:47:20 +01:00
#' ggplot_sir(
2022-08-28 10:31:50 +02:00
#' x = "ward",
#' facet = "antibiotic",
#' nrow = 1,
#' title = "AMR of Anti-UTI Drugs Per Ward",
#' x.title = "Ward",
#' datalabels = FALSE
#' )
2021-05-24 11:01:32 +02:00
#' }
2018-08-13 16:42:37 +02:00
#' }
2023-01-21 23:47:20 +01:00
ggplot_sir <- function(data,
2018-08-22 00:02:26 +02:00
position = NULL,
2019-06-13 14:28:46 +02:00
x = "antibiotic",
fill = "interpretation",
2018-08-23 21:27:15 +02:00
# params = list(),
2018-08-13 16:42:37 +02:00
facet = NULL,
breaks = seq(0, 1, 0.1),
limits = NULL,
2019-05-10 16:44:59 +02:00
translate_ab = "name",
2019-05-13 10:10:16 +02:00
combine_SI = TRUE,
minimum = 30,
language = get_AMR_locale(),
2018-08-29 16:35:32 +02:00
nrow = NULL,
2022-08-28 10:31:50 +02:00
colours = c(
S = "#3CAEA3",
SI = "#3CAEA3",
I = "#F6D55C",
IR = "#ED553B",
R = "#ED553B"
),
2019-05-31 20:25:57 +02:00
datalabels = TRUE,
datalabels.size = 2.5,
2020-10-21 13:07:23 +02:00
datalabels.colour = "grey15",
2019-05-31 20:25:57 +02:00
title = NULL,
subtitle = NULL,
caption = NULL,
2019-08-09 23:22:10 +02:00
x.title = "Antimicrobial",
y.title = "Proportion",
2018-08-13 16:42:37 +02:00
...) {
stop_ifnot_installed("ggplot2")
meet_criteria(data, allow_class = "data.frame", contains_column_class = c("sir", "rsi"))
meet_criteria(position, allow_class = "character", has_length = 1, is_in = c("fill", "stack", "dodge"), allow_NULL = TRUE)
meet_criteria(x, allow_class = "character", has_length = 1)
meet_criteria(fill, allow_class = "character", has_length = 1)
meet_criteria(facet, allow_class = "character", has_length = 1, allow_NULL = TRUE)
meet_criteria(breaks, allow_class = c("numeric", "integer"))
meet_criteria(limits, allow_class = c("numeric", "integer"), has_length = 2, allow_NULL = TRUE, allow_NA = TRUE)
meet_criteria(translate_ab, allow_class = c("character", "logical"), has_length = 1, allow_NA = TRUE)
meet_criteria(combine_SI, allow_class = "logical", has_length = 1)
meet_criteria(minimum, allow_class = c("numeric", "integer"), has_length = 1, is_positive_or_zero = TRUE, is_finite = TRUE)
2022-10-05 09:12:22 +02:00
language <- validate_language(language)
meet_criteria(nrow, allow_class = c("numeric", "integer"), has_length = 1, allow_NULL = TRUE, is_positive = TRUE, is_finite = TRUE)
2020-10-21 13:07:23 +02:00
meet_criteria(colours, allow_class = c("character", "logical"))
meet_criteria(datalabels, allow_class = "logical", has_length = 1)
meet_criteria(datalabels.size, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE)
meet_criteria(datalabels.colour, allow_class = "character", has_length = 1)
meet_criteria(title, allow_class = "character", has_length = 1, allow_NULL = TRUE)
meet_criteria(subtitle, allow_class = "character", has_length = 1, allow_NULL = TRUE)
meet_criteria(caption, allow_class = "character", has_length = 1, allow_NULL = TRUE)
meet_criteria(x.title, allow_class = "character", has_length = 1, allow_NULL = TRUE)
meet_criteria(y.title, allow_class = "character", has_length = 1, allow_NULL = TRUE)
2018-09-13 14:48:34 +02:00
# we work with aes_string later on
x_deparse <- deparse(substitute(x))
if (x_deparse != "x") {
x <- x_deparse
}
if (x %like% '".*"') {
x <- substr(x, 2, nchar(x) - 1)
}
facet_deparse <- deparse(substitute(facet))
if (facet_deparse != "facet") {
facet <- facet_deparse
}
if (facet %like% '".*"') {
facet <- substr(facet, 2, nchar(facet) - 1)
}
if (facet %in% c("NULL", "")) {
facet <- NULL
}
2022-08-28 10:31:50 +02:00
2019-05-31 20:25:57 +02:00
if (is.null(position)) {
position <- "fill"
}
2022-08-28 10:31:50 +02:00
2018-08-11 21:30:00 +02:00
p <- ggplot2::ggplot(data = data) +
2023-01-21 23:47:20 +01:00
geom_sir(
2022-08-28 10:31:50 +02:00
position = position, x = x, fill = fill, translate_ab = translate_ab,
minimum = minimum, language = language,
combine_SI = combine_SI, ...
2022-08-28 10:31:50 +02:00
) +
2023-01-21 23:47:20 +01:00
theme_sir()
2022-08-28 10:31:50 +02:00
2019-06-13 14:28:46 +02:00
if (fill == "interpretation") {
2023-01-21 23:47:20 +01:00
p <- p + scale_sir_colours(colours = colours)
2018-09-16 22:11:17 +02:00
}
2022-08-28 10:31:50 +02:00
2019-06-27 11:57:45 +02:00
if (identical(position, "fill")) {
# proportions, so use y scale with percentage
p <- p + scale_y_percent(breaks = breaks, limits = limits)
2018-08-22 00:02:26 +02:00
}
2022-08-28 10:31:50 +02:00
2019-06-27 11:57:45 +02:00
if (datalabels == TRUE) {
2023-01-21 23:47:20 +01:00
p <- p + labels_sir_count(
2022-08-28 10:31:50 +02:00
position = position,
x = x,
translate_ab = translate_ab,
minimum = minimum,
language = language,
combine_SI = combine_SI,
datalabels.size = datalabels.size,
datalabels.colour = datalabels.colour
)
2018-09-16 22:11:17 +02:00
}
2022-08-28 10:31:50 +02:00
2018-08-11 21:30:00 +02:00
if (!is.null(facet)) {
2023-01-21 23:47:20 +01:00
p <- p + facet_sir(facet = facet, nrow = nrow)
2018-08-11 21:30:00 +02:00
}
2022-08-28 10:31:50 +02:00
p <- p + ggplot2::labs(
title = title,
subtitle = subtitle,
caption = caption,
x = x.title,
y = y.title
)
2018-08-11 21:30:00 +02:00
p
}
2023-01-21 23:47:20 +01:00
#' @rdname ggplot_sir
2018-08-11 21:30:00 +02:00
#' @export
2023-01-21 23:47:20 +01:00
geom_sir <- function(position = NULL,
2019-06-13 14:28:46 +02:00
x = c("antibiotic", "interpretation"),
fill = "interpretation",
2019-05-10 16:44:59 +02:00
translate_ab = "name",
minimum = 30,
language = get_AMR_locale(),
2019-05-13 10:10:16 +02:00
combine_SI = TRUE,
2022-08-28 10:31:50 +02:00
...) {
2020-10-21 11:50:43 +02:00
x <- x[1]
stop_ifnot_installed("ggplot2")
stop_if(is.data.frame(position), "`position` is invalid. Did you accidentally use '%>%' instead of '+'?")
meet_criteria(position, allow_class = "character", has_length = 1, is_in = c("fill", "stack", "dodge"), allow_NULL = TRUE)
meet_criteria(x, allow_class = "character", has_length = 1)
meet_criteria(fill, allow_class = "character", has_length = 1)
meet_criteria(translate_ab, allow_class = c("character", "logical"), has_length = 1, allow_NA = TRUE)
meet_criteria(minimum, allow_class = c("numeric", "integer"), has_length = 1, is_positive_or_zero = TRUE, is_finite = TRUE)
2022-10-05 09:12:22 +02:00
language <- validate_language(language)
meet_criteria(combine_SI, allow_class = "logical", has_length = 1)
2022-08-28 10:31:50 +02:00
2019-06-13 14:28:46 +02:00
y <- "value"
2022-10-05 09:12:22 +02:00
if (missing(position) || is.null(position)) {
2019-06-27 11:57:45 +02:00
position <- "fill"
2018-08-22 00:02:26 +02:00
}
2022-08-28 10:31:50 +02:00
2019-05-31 20:25:57 +02:00
if (identical(position, "fill")) {
position <- ggplot2::position_fill(vjust = 0.5, reverse = TRUE)
}
2022-08-28 10:31:50 +02:00
2018-09-13 14:48:34 +02:00
# we work with aes_string later on
x_deparse <- deparse(substitute(x))
if (x_deparse != "x") {
x <- x_deparse
}
if (x %like% '".*"') {
x <- substr(x, 2, nchar(x) - 1)
}
2022-08-28 10:31:50 +02:00
2019-10-11 17:21:02 +02:00
if (tolower(x) %in% tolower(c("ab", "abx", "antibiotics"))) {
2019-06-13 14:28:46 +02:00
x <- "antibiotic"
2023-01-21 23:47:20 +01:00
} else if (tolower(x) %in% tolower(c("SIR", "sir", "interpretations", "result"))) {
2019-06-13 14:28:46 +02:00
x <- "interpretation"
2018-08-11 21:30:00 +02:00
}
2022-08-28 10:31:50 +02:00
ggplot2::geom_col(
data = function(x) {
2023-01-21 23:47:20 +01:00
sir_df(
2022-08-28 10:31:50 +02:00
data = x,
translate_ab = translate_ab,
language = language,
minimum = minimum,
combine_SI = combine_SI
2022-08-28 10:31:50 +02:00
)
},
mapping = ggplot2::aes_string(x = x, y = y, fill = fill),
position = position,
...
)
2018-08-11 21:30:00 +02:00
}
2023-01-21 23:47:20 +01:00
#' @rdname ggplot_sir
2018-08-11 21:30:00 +02:00
#' @export
2023-01-21 23:47:20 +01:00
facet_sir <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) {
2019-05-31 20:25:57 +02:00
facet <- facet[1]
stop_ifnot_installed("ggplot2")
meet_criteria(facet, allow_class = "character", has_length = 1)
meet_criteria(nrow, allow_class = c("numeric", "integer"), has_length = 1, allow_NULL = TRUE, is_positive = TRUE, is_finite = TRUE)
2022-08-28 10:31:50 +02:00
2018-09-13 14:48:34 +02:00
# we work with aes_string later on
facet_deparse <- deparse(substitute(facet))
if (facet_deparse != "facet") {
facet <- facet_deparse
}
if (facet %like% '".*"') {
facet <- substr(facet, 2, nchar(facet) - 1)
}
2022-08-28 10:31:50 +02:00
2023-01-21 23:47:20 +01:00
if (tolower(facet) %in% tolower(c("SIR", "sir", "interpretations", "result"))) {
2019-06-13 14:28:46 +02:00
facet <- "interpretation"
2019-10-11 17:21:02 +02:00
} else if (tolower(facet) %in% tolower(c("ab", "abx", "antibiotics"))) {
2019-06-13 14:28:46 +02:00
facet <- "antibiotic"
2018-08-11 21:30:00 +02:00
}
2022-08-28 10:31:50 +02:00
2018-08-29 16:35:32 +02:00
ggplot2::facet_wrap(facets = facet, scales = "free_x", nrow = nrow)
2018-08-11 21:30:00 +02:00
}
2023-01-21 23:47:20 +01:00
#' @rdname ggplot_sir
2018-08-11 21:30:00 +02:00
#' @export
scale_y_percent <- function(breaks = seq(0, 1, 0.1), limits = NULL) {
stop_ifnot_installed("ggplot2")
meet_criteria(breaks, allow_class = c("numeric", "integer"))
meet_criteria(limits, allow_class = c("numeric", "integer"), has_length = 2, allow_NULL = TRUE, allow_NA = TRUE)
2022-08-28 10:31:50 +02:00
2019-01-02 23:24:07 +01:00
if (all(breaks[breaks != 0] > 1)) {
breaks <- breaks / 100
}
2022-08-28 10:31:50 +02:00
ggplot2::scale_y_continuous(
breaks = breaks,
labels = percentage(breaks),
limits = limits
)
2018-08-11 21:30:00 +02:00
}
2023-01-21 23:47:20 +01:00
#' @rdname ggplot_sir
2018-08-11 21:30:00 +02:00
#' @export
2023-01-21 23:47:20 +01:00
scale_sir_colours <- function(...,
aesthetics = "fill") {
stop_ifnot_installed("ggplot2")
meet_criteria(aesthetics, allow_class = "character", is_in = c("alpha", "colour", "color", "fill", "linetype", "shape", "size"))
2023-01-21 23:47:20 +01:00
# behaviour until AMR pkg v1.5.0 and also when coming from ggplot_sir()
2021-02-26 12:11:29 +01:00
if ("colours" %in% names(list(...))) {
2022-08-28 10:31:50 +02:00
original_cols <- c(
S = "#3CAEA3",
SI = "#3CAEA3",
I = "#F6D55C",
IR = "#ED553B",
R = "#ED553B"
)
2021-02-26 12:11:29 +01:00
colours <- replace(original_cols, names(list(...)$colours), list(...)$colours)
# limits = force is needed in ggplot2 3.3.4 and 3.3.5, see here;
# https://github.com/tidyverse/ggplot2/issues/4511#issuecomment-866185530
return(ggplot2::scale_fill_manual(values = colours, limits = force))
2021-02-26 12:11:29 +01:00
}
if (identical(unlist(list(...)), FALSE)) {
return(invisible())
2019-05-31 20:25:57 +02:00
}
2022-08-28 10:31:50 +02:00
names_susceptible <- c(
"S", "SI", "IS", "S+I", "I+S", "susceptible", "Susceptible",
unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Susceptible"),
"replacement",
drop = TRUE
])
)
names_incr_exposure <- c(
"I", "intermediate", "increased exposure", "incr. exposure",
"Increased exposure", "Incr. exposure", "Susceptible, incr. exp.",
unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Intermediate"),
"replacement",
drop = TRUE
]),
unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Susceptible, incr. exp."),
"replacement",
drop = TRUE
])
)
names_resistant <- c(
"R", "IR", "RI", "R+I", "I+R", "resistant", "Resistant",
unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Resistant"),
"replacement",
drop = TRUE
])
)
2021-02-26 12:11:29 +01:00
susceptible <- rep("#3CAEA3", length(names_susceptible))
names(susceptible) <- names_susceptible
incr_exposure <- rep("#F6D55C", length(names_incr_exposure))
names(incr_exposure) <- names_incr_exposure
resistant <- rep("#ED553B", length(names_resistant))
names(resistant) <- names_resistant
2022-08-28 10:31:50 +02:00
original_cols <- c(susceptible, incr_exposure, resistant)
2021-02-26 12:11:29 +01:00
dots <- c(...)
2023-01-21 23:47:20 +01:00
# replace S, I, R as colours: scale_sir_colours(mydatavalue = "S")
2021-02-26 12:11:29 +01:00
dots[dots == "S"] <- "#3CAEA3"
dots[dots == "I"] <- "#F6D55C"
dots[dots == "R"] <- "#ED553B"
cols <- replace(original_cols, names(dots), dots)
# limits = force is needed in ggplot2 3.3.4 and 3.3.5, see here;
# https://github.com/tidyverse/ggplot2/issues/4511#issuecomment-866185530
ggplot2::scale_discrete_manual(aesthetics = aesthetics, values = cols, limits = force)
2018-08-11 21:30:00 +02:00
}
2023-01-21 23:47:20 +01:00
#' @rdname ggplot_sir
2018-08-11 21:30:00 +02:00
#' @export
2023-01-21 23:47:20 +01:00
theme_sir <- function() {
stop_ifnot_installed("ggplot2")
2019-05-31 20:25:57 +02:00
ggplot2::theme_minimal(base_size = 10) +
2022-08-28 10:31:50 +02:00
ggplot2::theme(
panel.grid.major.x = ggplot2::element_blank(),
panel.grid.minor = ggplot2::element_blank(),
panel.grid.major.y = ggplot2::element_line(colour = "grey75"),
# center title and subtitle
plot.title = ggplot2::element_text(hjust = 0.5),
plot.subtitle = ggplot2::element_text(hjust = 0.5)
)
2018-08-11 21:30:00 +02:00
}
2018-09-16 22:11:17 +02:00
2023-01-21 23:47:20 +01:00
#' @rdname ggplot_sir
2018-09-16 22:11:17 +02:00
#' @export
2023-01-21 23:47:20 +01:00
labels_sir_count <- function(position = NULL,
2019-06-13 14:28:46 +02:00
x = "antibiotic",
2019-05-31 20:25:57 +02:00
translate_ab = "name",
minimum = 30,
language = get_AMR_locale(),
2019-05-31 20:25:57 +02:00
combine_SI = TRUE,
2018-09-16 22:11:17 +02:00
datalabels.size = 3,
2020-10-21 13:07:23 +02:00
datalabels.colour = "grey15") {
stop_ifnot_installed("ggplot2")
meet_criteria(position, allow_class = "character", has_length = 1, is_in = c("fill", "stack", "dodge"), allow_NULL = TRUE)
meet_criteria(x, allow_class = "character", has_length = 1)
meet_criteria(translate_ab, allow_class = c("character", "logical"), has_length = 1, allow_NA = TRUE)
meet_criteria(minimum, allow_class = c("numeric", "integer"), has_length = 1, is_positive_or_zero = TRUE, is_finite = TRUE)
2022-10-05 09:12:22 +02:00
language <- validate_language(language)
meet_criteria(combine_SI, allow_class = "logical", has_length = 1)
meet_criteria(datalabels.size, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE)
meet_criteria(datalabels.colour, allow_class = "character", has_length = 1)
2022-08-28 10:31:50 +02:00
2018-09-16 22:11:17 +02:00
if (is.null(position)) {
position <- "fill"
}
2019-05-30 08:51:38 +02:00
if (identical(position, "fill")) {
position <- ggplot2::position_fill(vjust = 0.5, reverse = TRUE)
2018-09-16 22:11:17 +02:00
}
2019-05-31 20:25:57 +02:00
x_name <- x
2022-08-28 10:31:50 +02:00
ggplot2::geom_text(
mapping = ggplot2::aes_string(
label = "lbl",
x = x,
y = "value"
),
position = position,
inherit.aes = FALSE,
size = datalabels.size,
colour = datalabels.colour,
lineheight = 0.75,
data = function(x) {
2023-01-21 23:47:20 +01:00
transformed <- sir_df(
2022-08-28 10:31:50 +02:00
data = x,
translate_ab = translate_ab,
combine_SI = combine_SI,
minimum = minimum,
language = language
)
transformed$gr <- transformed[, x_name, drop = TRUE]
2023-02-09 13:07:39 +01:00
transformed %pm>%
pm_group_by(gr) %pm>%
pm_mutate(lbl = paste0("n=", isolates)) %pm>%
pm_ungroup() %pm>%
pm_select(-gr)
2022-08-28 10:31:50 +02:00
}
)
2018-09-16 22:11:17 +02:00
}