--- title: "Plots" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{a02_plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", warning = FALSE, message = FALSE, fig.width=7.2, fig.height=5 ) options(rmarkdown.html_vignette.check_title = FALSE) ``` **visOmopResults** provides plotting tools that simplify visualising data in `` format while also being compatible with other formats. ```{r setup} library(visOmopResults) ``` ## Plotting with a `` For this vignette, we will use the `penguins` dataset from the **palmerpenguins** package. This dataset will be summarised using the `PatientProfiles::summariseResult()` function, which aggregates the data into the `` format: ```{r} library(PatientProfiles) library(palmerpenguins) library(dplyr) summariseIsland <- function(island) { penguins |> filter(.data$island == .env$island) |> summariseResult( group = "species", includeOverallGroup = TRUE, strata = list("year", "sex", c("year", "sex")), variables = c( "bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g", "sex"), estimates = c( "median", "q25", "q75", "min", "max", "count_missing", "count", "percentage", "density") ) |> suppressMessages() |> mutate(cdm_name = island) } penguinsSummary <- bind( summariseIsland("Torgersen"), summariseIsland("Biscoe"), summariseIsland("Dream") ) penguinsSummary |> glimpse() ``` ### Plotting principles for `` objects **1) Tidy Format** When working with `` objects, the data is internally converted into the tidy format before plotting. This is an important distinction because columns such as `strata_name` and `strata_level` from the original `` cannot be used directly with the plotting functions. Instead, tidy columns should be referenced. For more information about the tidy format, refer to the **omopgenerics** package vignette on `` [here](https://darwin-eu.github.io/omopgenerics/articles/summarised_result.html#tidy-a-summarised_result). To identify the available tidy columns, use the `tidyColumns()` function: ```{r} tidyColumns(penguinsSummary) ``` **2) Subsetting Variables** Before calling the plotting functions, always subset the `` object to the variable of interest. Avoid combining results from unrelated variables, as this may lead to NA values in the tidy format, which can affect your plots. ### Scatter plot We can create simple scatter plots using the `plotScatter()` let's see some examples: ```{r} penguinsSummary |> filter(variable_name == "bill_depth_mm") |> filterStrata(year != "overall", sex == "overall") |> scatterPlot( x = "year", y = "median", line = TRUE, point = TRUE, ribbon = FALSE, facet = "cdm_name", colour = "species" ) ``` Additionally, we can use the function `themeVisOmop()` to change the default `ggplot2` style to our default style. Not only that, but we can use standard ggplot2 functionalities to the returned plot: ```{r} penguinsSummary |> filter(variable_name %in% c("bill_length_mm", "bill_depth_mm"))|> filterStrata(year == "overall", sex == "overall") |> filterGroup(species != "overall") |> scatterPlot( x = "density_x", y = "density_y", line = TRUE, point = FALSE, ribbon = FALSE, facet = cdm_name ~ variable_name, colour = "species" ) + themeVisOmop() + ggplot2::facet_grid(cdm_name ~ variable_name, scales = "free_x") ``` ```{r} penguinsSummary |> filter(variable_name == "flipper_length_mm") |> filterStrata(year != "overall", sex %in% c("female", "male")) |> scatterPlot( x = c("year", "sex"), y = "median", ymin = "q25", ymax = "q75", line = FALSE, point = TRUE, ribbon = FALSE, facet = cdm_name ~ species, colour = "sex", group = c("year", "sex") ) + themeVisOmop() + ggplot2::coord_flip() + ggplot2::labs(y = "Flipper length (mm)") + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust=1)) ``` ```{r} penguinsSummary |> filter( variable_name %in% c("flipper_length_mm", "bill_length_mm", "bill_depth_mm") ) |> filterStrata(sex == "overall") |> scatterPlot( x = "year", y = "median", ymin = "min", ymax = "max", line = FALSE, point = TRUE, ribbon = TRUE, facet = cdm_name ~ species, colour = "variable_name", group = c("variable_name") ) + themeVisOmop(fontsizeRef = 12) + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust=1)) ``` ### Bar plot Let's create a bar plots: ```{r} penguinsSummary |> filter(variable_name == "number records") |> filterGroup(species != "overall") |> filterStrata(sex != "overall", year != "overall") |> barPlot( x = "year", y = "count", colour = "sex", facet = cdm_name ~ species ) + themeVisOmop(fontsizeRef = 12) ``` ### Box plot Let's create some box plots of their body mass: ```{r} penguinsSummary |> filter(variable_name == "body_mass_g") |> boxPlot(x = "year", facet = species ~ cdm_name, colour = "sex") + themeVisOmop() ``` ```{r} penguinsSummary |> filter(variable_name == "body_mass_g") |> filterGroup(species != "overall") |> filterStrata(sex %in% c("female", "male"), year != "overall") |> boxPlot(x = "cdm_name", facet = c("sex", "species"), colour = "year") + themeVisOmop(fontsizeRef = 11) ``` Note that as we didnt specify x there is no levels in the x axis, but box plots are produced anyway. ## Plotting with a `` Plotting functions can also be used with the usual ``. In this case we will use the tidy format of `penguinsSummary`. ```{r} penguinsTidy <- penguinsSummary |> filter(!estimate_name %in% c("density_x", "density_y")) |> # remove density for simplicity tidy() penguinsTidy |> glimpse() ``` Using this tidy format, we can replicate plots. For instance, we recreate the previous example: ```{r} penguinsTidy |> filter( variable_name == "body_mass_g", species != "overall", sex %in% c("female", "male"), year != "overall" ) |> boxPlot(x = "cdm_name", facet = sex ~ species, colour = "year") + themeVisOmop() ``` ## Custom plotting The tidy format is very useful to apply any other custom ggplot2 function that we may be interested on: ```{r} library(ggplot2) penguinsSummary |> filter(variable_name == "number records") |> tidy() |> ggplot(aes(x = year, y = sex, fill = count, label = count)) + themeVisOmop() + geom_tile() + scale_fill_viridis_c(trans = "log") + geom_text() + facet_grid(cdm_name ~ species) + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust=1)) ``` ## Combine with `ggplot2` The plotting functions are a wrapper around the ggplot2 package, outputs of the plotting functions can be later customised with ggplot2 and similar tools. For example we can use `ggplot2::labs()` to change the labels and `ggplot2::theme()` to move the location of the legend. ```{r} penguinsSummary |> filter( group_level != "overall", strata_name == "year &&& sex", !grepl("NA", strata_level), variable_name == "body_mass_g") |> boxPlot(x = "species", facet = cdm_name ~ sex, colour = "year") + themeVisOmop(fontsizeRef = 12) + ylim(c(0, 6500)) + labs(x = "My custom x label") ``` You can also use `ggplot2::ggsave()` to later save one of this plots into '.png' file. ```{r, eval=FALSE} ggsave( "figure8.png", plot = last_plot(), device = "png", width = 15, height = 12, units = "cm", dpi = 300) ``` ## Combine with `plotly` Although the package currently does not provide any plotly functionality ggplots can be easily converted to `` ones using the function `plotly::ggplotly()`. This can make the interactivity of some plots better.