--- title: "EpiGantt: epigantt charts in ggplot with ggsurveillance" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{EpiGantt: epigantt charts in ggplot with ggsurveillance} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", warning = FALSE, message = FALSE, fig.width = 7, fig.height = 4 ) ``` ```{r setup, echo = FALSE} library(ggplot2) library(dplyr) library(tidyr) library(outbreaks) library(ggsurveillance) ``` ## EpiGantt examples This vignette is still work in progress. But the examples are hopefully already helpful and inspiring. Epi Gantt plots are used to visualize exposure times in infectious disease outbreaks. Hospital outbreaks are a common example for their use. Lying times of patients on different wards can be visualized and potential transmission routes identified. Like this: ```{r echo=FALSE} # Transform to long format linelist_hospital_outbreak |> pivot_longer( cols = starts_with("ward"), names_to = c(".value", "num"), names_pattern = "ward_(name|start_of_stay|end_of_stay)_([0-9]+)", values_drop_na = TRUE ) -> df_stays_long linelist_hospital_outbreak |> pivot_longer(cols = starts_with("pathogen"), values_to = "date") -> df_detections_long # Plot ggplot(df_stays_long) + geom_epigantt(aes(y = Patient, xmin = start_of_stay, xmax = end_of_stay, color = name)) + geom_point(aes(y = Patient, x = date, shape = "Date of pathogen detection"), data = df_detections_long) + scale_y_discrete_reverse() + theme_bw() + theme(legend.position = "bottom") ``` ### Start with the Line List ```{r} linelist_hospital_outbreak ``` ### Transform the Line List into long format for ggplot ```{r} linelist_hospital_outbreak |> pivot_longer( cols = starts_with("ward"), names_to = c(".value", "num"), names_pattern = "ward_(name|start_of_stay|end_of_stay)_([0-9]+)", values_drop_na = TRUE ) -> df_stays_long df_stays_long |> select(Patient, num:end_of_stay) linelist_hospital_outbreak |> pivot_longer(cols = starts_with("pathogen"), values_to = "date", values_drop_na = TRUE) -> df_detections_long df_detections_long |> select(Patient, name, date) ``` ### Plot the Epigantt chart ```{r} ggplot(df_stays_long) + geom_epigantt(aes(y = Patient, xmin = start_of_stay, xmax = end_of_stay, color = name)) + geom_point(aes(y = Patient, x = date, shape = "Date of pathogen detection"), data = df_detections_long) + scale_y_discrete_reverse() + theme_bw() + theme(legend.position = "bottom") ``` ## Outbreak 2: Fictional Varicella Outbreak in Berlin ```{r} outbreaks::varicella_sim_berlin |> filter(center1 == "Platz der Luftbruecke") |> arrange(onset) |> slice_head(n = 20) |> mutate( fullname = paste(firstname, lastname), fullname = factor(fullname, levels = rev(fullname)) ) |> pivot_longer( cols = starts_with(c("arrival", "leave", "center")), names_to = c(".value", "group"), names_pattern = "(\\w+)(\\d+)" ) |> ggplot(aes(y = fullname)) + geom_epigantt(aes(xmin = arrival, xmax = leave, colour = center), lw_scaling_factor = 100) + # linewidth = 4 # geom_point(aes(x = onset)) + theme_bw() + theme(legend.position = "top") ``` ```{r} ggplot(outbreaks::measles_hagelloch_1861, aes(y = case_ID, xmin = date_of_prodrome, xmax = date_of_rash, fill = class)) + geom_vline_year(color = "grey50") + geom_epigantt() + scale_x_date(date_breaks = "2 weeks", date_labels = "W%V'%G") + theme_bw() ```