From f8491e5b475f719e23837c79b7317dbc44a2e794 Mon Sep 17 00:00:00 2001 From: Aris Paschalidis Date: Sun, 31 Jul 2022 21:43:32 +0300 Subject: [PATCH] Plot coverage (#46) * Add a function to plot the coverage * Add tests for coverage plots * Add function to `{pkgdown}` site * Update NEWS --- NAMESPACE | 4 + NEWS.md | 2 + R/plot_coverage.R | 67 +++++++++++++ _pkgdown.yml | 1 + man/plot_coverage.Rd | 33 +++++++ tests/testthat/_snaps/plot_coverage.md | 5 + .../plot_coverage/can-add-ggplot2-layers.svg | 99 +++++++++++++++++++ .../default-plot-is-informative.svg | 99 +++++++++++++++++++ tests/testthat/test-plot_coverage.R | 22 +++++ 9 files changed, 332 insertions(+) create mode 100644 R/plot_coverage.R create mode 100644 man/plot_coverage.Rd create mode 100644 tests/testthat/_snaps/plot_coverage.md create mode 100644 tests/testthat/_snaps/plot_coverage/can-add-ggplot2-layers.svg create mode 100644 tests/testthat/_snaps/plot_coverage/default-plot-is-informative.svg create mode 100644 tests/testthat/test-plot_coverage.R diff --git a/NAMESPACE b/NAMESPACE index 9a6d0de..4dd8949 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -35,6 +35,9 @@ S3method(mutation_prevalence,geno_tbl) S3method(mutation_prevalence,ref_alt_cov_tbl) S3method(plot,mut_freq) S3method(plot,mut_prev) +S3method(plot_coverage,cov_tbl) +S3method(plot_coverage,default) +S3method(plot_coverage,ref_alt_cov_tbl) S3method(tbl_sum,alt_tbl) S3method(tbl_sum,cov_tbl) S3method(tbl_sum,geno_tbl) @@ -65,6 +68,7 @@ export(miplicorn_example) export(mutation_frequency) export(mutation_prevalence) export(plot_chromoMap) +export(plot_coverage) export(plot_karyoploteR) export(plot_mutation_frequency) export(plot_mutation_prevalence) diff --git a/NEWS.md b/NEWS.md index 9ac750a..7bc97ea 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # miplicorn (development version) +- New `plot_coverage()` function can be used to plot the average coverage across + a given grouping variable (#46). - The column created by `label_mutations()` has been renamed from `ans_der_indel` to `mutation_label` (#44). - `label_mutations()` more clearly signals when the computation can not be diff --git a/R/plot_coverage.R b/R/plot_coverage.R new file mode 100644 index 0000000..3139bb3 --- /dev/null +++ b/R/plot_coverage.R @@ -0,0 +1,67 @@ +#------------------------------------------------ +#' Plot coverage +#' +#' Create a bar chart visualizing the average coverage across a given grouping +#' variable. The color of each bar represents the magnitude of the mean +#' coverage. +#' +#' @param data A data frame, data frame extension (e.g. a tibble), or a lazy +#' data frame (e.g. from dbplyr or dtplyr). +#' @param group_by The grouping variable. The average coverage is computed for +#' each unique value of the variable. +#' +#' @export +#' @examples +#' # Read example data +#' data <- read_tbl_coverage(miplicorn_example("coverage_AA_table.csv")) +#' +#' # Plot coverage grouped by gene +#' plot_coverage(data, gene) +#' @export +plot_coverage <- function(data, group_by) { + UseMethod("plot_coverage") +} + +#' @export +plot_coverage.default <- function(data, group_by) { + cli_abort(c( + "Cannot plot the coverage with this data object.", + "i" = "Object must be a coverage table or a reference, alternate, coverage table." + )) +} + +# Plotting function +plot_coverage_fn <- function(data, group_by) { + # Ensure inputs exist + rlang::check_required(data) + rlang::check_required(group_by) + + # Group and create stats + plot_data <- data %>% + dplyr::group_by({{ group_by }}) %>% + dplyr::summarise(mean_coverage = mean(.data$coverage, na.rm = TRUE)) + + # Plot + ggplot2::ggplot( + data = plot_data, + mapping = ggplot2::aes( + x = {{ group_by }}, + y = .data$mean_coverage, + fill = .data$mean_coverage + ) + ) + + ggplot2::geom_col() + + default_theme() + + ggplot2::theme( + axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust = 1), + legend.position = "none" + ) +} + +#' @rdname plot_coverage +#' @export +plot_coverage.cov_tbl <- plot_coverage_fn + +#' @rdname plot_coverage +#' @export +plot_coverage.ref_alt_cov_tbl <- plot_coverage_fn diff --git a/_pkgdown.yml b/_pkgdown.yml index 2d9e65f..174f700 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -51,6 +51,7 @@ reference: These functions are used to visualize data. contents: - chromosome-map + - plot_coverage - plot_mutation_prevalence - plot_mutation_frequency - theme_miplicorn diff --git a/man/plot_coverage.Rd b/man/plot_coverage.Rd new file mode 100644 index 0000000..76ff83a --- /dev/null +++ b/man/plot_coverage.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plot_coverage.R +\name{plot_coverage} +\alias{plot_coverage} +\alias{plot_coverage.cov_tbl} +\alias{plot_coverage.ref_alt_cov_tbl} +\title{Plot coverage} +\usage{ +plot_coverage(data, group_by) + +\method{plot_coverage}{cov_tbl}(data, group_by) + +\method{plot_coverage}{ref_alt_cov_tbl}(data, group_by) +} +\arguments{ +\item{data}{A data frame, data frame extension (e.g. a tibble), or a lazy +data frame (e.g. from dbplyr or dtplyr).} + +\item{group_by}{The grouping variable. The average coverage is computed for +each unique value of the variable.} +} +\description{ +Create a bar chart visualizing the average coverage across a given grouping +variable. The color of each bar represents the magnitude of the mean +coverage. +} +\examples{ +# Read example data +data <- read_tbl_coverage(miplicorn_example("coverage_AA_table.csv")) + +# Plot coverage grouped by gene +plot_coverage(data, gene) +} diff --git a/tests/testthat/_snaps/plot_coverage.md b/tests/testthat/_snaps/plot_coverage.md new file mode 100644 index 0000000..c25624c --- /dev/null +++ b/tests/testthat/_snaps/plot_coverage.md @@ -0,0 +1,5 @@ +# data must have mut_prev class + + Cannot plot the coverage with this data object. + i Object must be a coverage table or a reference, alternate, coverage table. + diff --git a/tests/testthat/_snaps/plot_coverage/can-add-ggplot2-layers.svg b/tests/testthat/_snaps/plot_coverage/can-add-ggplot2-layers.svg new file mode 100644 index 0000000..1fa8b9b --- /dev/null +++ b/tests/testthat/_snaps/plot_coverage/can-add-ggplot2-layers.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 +50 +100 +150 +200 + + + + + + + + + + + + + + + + + + + + + + + +PF3D7-1322700 +PF3D7-1451200 +PF3D7_0304600 +PF3D7_1133400 +PF3D7_1335900 +PF3D7_1410400 +atp6 +crt +cytb +dhfr-ts +dhps +fd +k13 +mdr1 +mdr2 +pib7 +pph +Gene +Average Coverage +can add ggplot2 layers + + diff --git a/tests/testthat/_snaps/plot_coverage/default-plot-is-informative.svg b/tests/testthat/_snaps/plot_coverage/default-plot-is-informative.svg new file mode 100644 index 0000000..24c08b4 --- /dev/null +++ b/tests/testthat/_snaps/plot_coverage/default-plot-is-informative.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 +50 +100 +150 +200 + + + + + + + + + + + + + + + + + + + + + + + +PF3D7-1322700 +PF3D7-1451200 +PF3D7_0304600 +PF3D7_1133400 +PF3D7_1335900 +PF3D7_1410400 +atp6 +crt +cytb +dhfr-ts +dhps +fd +k13 +mdr1 +mdr2 +pib7 +pph +gene +mean_coverage +default plot is informative + + diff --git a/tests/testthat/test-plot_coverage.R b/tests/testthat/test-plot_coverage.R new file mode 100644 index 0000000..5493f69 --- /dev/null +++ b/tests/testthat/test-plot_coverage.R @@ -0,0 +1,22 @@ +data <- read_tbl_coverage(miplicorn_example("coverage_AA_table.csv")) + +test_that("data must have mut_prev class", { + df <- tibble::tibble(a = 1, b = 2) + expect_error(plot_coverage(df, b)) + expect_snapshot_error(plot_coverage(df, b)) +}) + +test_that("creates a nice plot", { + vdiffr::expect_doppelganger( + "default plot is informative", + plot_coverage(data, gene) + ) +}) + +test_that("can add ggplot2 layers", { + vdiffr::expect_doppelganger( + "can add ggplot2 layers", + plot_coverage(data, gene) + + ggplot2::labs(x = "Gene", y = "Average Coverage") + ) +})