plotgardener
is modular and separates plotting and
annotating into two different categories of functions. To specify which
plot to annotate within an annotation function, each annotation function
has a plot
parameter that accepts plotgardener
plot objects. This will facilitate in inheriting genomic region and plot
location information. In this article we will go through some of the
major types of annotations used to create accurate and informative
plotgardener
plots.
All the data included in this article can be found in the
supplementary package plotgardenerData
.
Genome labels are some of the most important annotations for giving
context to the genomic region of data. annoGenomeLabel()
can add genome labels with various customizations.
Genome labels can be shown at three different basepair scales (Mb,
Kb, and bp) depending on the size of the region and the desired accuracy
of the start and end labels. In the genomic region
chr21:28000000-30300000
we can use a Mb scale:
data("IMR90_HiC_10kb")
pageCreate(
width = 3, height = 3.25, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb,
chrom = "chr21", chromstart = 28000000, chromend = 30300000,
assembly = "hg19",
x = 0.25, y = 0.25, width = 2.5, height = 2.5, default.units = "inches"
)
annoGenomeLabel(
plot = hicPlot, scale = "Mb",
x = 0.25, y = 2.76
)
If we use a more specific genomic region like
chr21:28255554-29354665
, the Mb scale will be rounded and
indicated with an approximation sign:
#> Warning: Start label is rounded.
#> Warning: End label is rounded.
Thus, it makes more sense to use the bp scale for ultimate accuracy:
data("IMR90_HiC_10kb")
pageCreate(
width = 3, height = 3.25, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb,
chrom = "chr21", chromstart = 28255554, chromend = 29354665,
assembly = "hg19",
x = 0.25, y = 0.25, width = 2.5, height = 2.5, default.units = "inches"
)
annoGenomeLabel(
plot = hicPlot, scale = "bp",
x = 0.25, y = 2.76
)
If our genomic region is small enough, annoGenomeLabel()
can also be used to display the nucleotide sequence of that region.
Similar to IGV, annoGenomeLabel()
will first represent
nucleotides as colored boxes:
At even finer scales, annoGenomeLabel()
will then
represent nucleotides with colored letters:
In the specific case of square Hi-C plots (hicSquare
objects), annoGenomeLabel()
can annotate the genome label
along the y-axis:
data("IMR90_HiC_10kb")
pageCreate(
width = 3.25, height = 3, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb,
chrom = "chr21", chromstart = 28000000, chromend = 30300000,
assembly = "hg19",
x = 0.5, y = 0.25, width = 2.5, height = 2.5, default.units = "inches"
)
annoGenomeLabel(
plot = hicPlot, scale = "Mb",
axis = "y",
x = 0.5, y = 0.25,
just = c("right", "top")
)
In addition to genomic axes, it is also common to annotate standard x
and y-axes for measures of scale. This functionality is provided by the
annoXaxis()
and annoYaxis()
functions. For
example, a Manhattan plot requires a y-axis to indicate the range of
p-values:
library("TxDb.Hsapiens.UCSC.hg19.knownGene")
data("hg19_insulin_GWAS")
pageCreate(
width = 7.5, height = 2.75, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
manhattanPlot <- plotManhattan(
data = hg19_insulin_GWAS, assembly = "hg19",
fill = c("grey", "#37a7db"),
sigLine = TRUE,
col = "grey", lty = 2, range = c(0, 14),
x = 0.5, y = 0.25, width = 6.5, height = 2,
just = c("left", "top"),
default.units = "inches"
)
annoGenomeLabel(
plot = manhattanPlot, x = 0.5, y = 2.25, fontsize = 8,
just = c("left", "top"), default.units = "inches"
)
plotText(
label = "Chromosome", fontsize = 8,
x = 3.75, y = 2.45, just = "center", default.units = "inches"
)
## Annotate y-axis
annoYaxis(
plot = manhattanPlot, at = c(0, 2, 4, 6, 8, 10, 12, 14),
axisLine = TRUE, fontsize = 8
)
## Plot y-axis label
plotText(
label = "-log10(p-value)", x = 0.15, y = 1.25, rot = 90,
fontsize = 8, fontface = "bold", just = "center",
default.units = "inches"
)
annoXaxis()
and annoYaxis()
have similar
usages and customizations.
Heatmap-style plots with numbers translated to a palette of colors
require a specific type of legend. This legend can be plotted with
annoHeatmapLegend()
in both vertical and horizontal
orientations. Genomic plots that typically require this annotation are
Hi-C plots made with plotHicRectangle()
,
plotHicSquare()
, or plotHicTriangle()
.
data("IMR90_HiC_10kb")
pageCreate(
width = 3.25, height = 3.25, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
params <- pgParams(
chrom = "chr21", chromstart = 28000000, chromend = 30300000,
assembly = "hg19",
x = 0.25, width = 2.75, just = c("left", "top"), default.units = "inches"
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb, params = params,
zrange = c(0, 70), resolution = 10000,
y = 0.25, height = 2.75
)
## Annotate Hi-C heatmap legend
annoHeatmapLegend(
plot = hicPlot, fontsize = 7,
orientation = "v",
x = 0.125, y = 0.25,
width = 0.07, height = 0.5, just = c("left", "top"),
default.units = "inches"
)
annoHeatmapLegend(
plot = hicPlot, fontsize = 7,
orientation = "h",
x = 3, y = 3.055,
width = 0.5, height = 0.07, just = c("right", "top"),
default.units = "inches"
)
It is possible to annotate the pixels on a Hi-C plot with provided BEDPE data. Pixels can be annotated with boxes, circles, or squares.
data("IMR90_HiC_10kb")
data("IMR90_DNAloops_pairs")
pageCreate(
width = 3.25, height = 3.24, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb, resolution = 10000, zrange = c(0, 70),
chrom = "chr21", chromstart = 28000000, chromend = 30300000,
assembly = "hg19",
x = 0.25, y = 0.25, width = 2.75, height = 2.75,
just = c("left", "top"),
default.units = "inches"
)
## Annotate pixels
pixels <- annoPixels(
plot = hicPlot, data = IMR90_DNAloops_pairs, type = "box",
half = "top"
)
If we want to annotate one pixel of interest, we can subset our BEDPE
data and annoPixels()
will only annotate the specified
pixels:
data("IMR90_HiC_10kb")
data("IMR90_DNAloops_pairs")
## Subset BEDPE data
IMR90_DNAloops_pairs <- IMR90_DNAloops_pairs[which(IMR90_DNAloops_pairs$start1 == 28220000 &
IMR90_DNAloops_pairs$start2 == 29070000), ]
pageCreate(
width = 3.25, height = 3.24, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb, resolution = 10000, zrange = c(0, 70),
chrom = "chr21", chromstart = 28000000, chromend = 30300000,
x = 0.25, y = 0.25, width = 2.75, height = 2.75,
just = c("left", "top"),
default.units = "inches"
)
## Annotate pixel
pixels <- annoPixels(
plot = hicPlot, data = IMR90_DNAloops_pairs, type = "arrow",
half = "bottom", shift = 12
)
For genomic ranges of domain data, we can annotate Hi-C domains with
annoDomains()
. For example, if we want to annotate the
following domains
domains <- GRanges("chr21",
ranges = IRanges(
start = c(28210000, 29085000, 29430000, 29700000),
end = c(29085000, 29430000, 29700000, 30125000)
)
)
in this Hi-C plot:
We would use a similar workflow to how we annotated Hi-C pixels:
pageCreate(
width = 3.25, height = 3.24, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
hicPlot <- plotHicSquare(
data = IMR90_HiC_10kb, resolution = 10000, zrange = c(0, 70),
chrom = "chr21", chromstart = 28000000, chromend = 30300000,
x = 0.25, y = 0.25, width = 2.75, height = 2.75,
just = c("left", "top"),
default.units = "inches"
)
## Annotate domains
domainAnno <- annoDomains(
plot = hicPlot, data = domains,
half = "bottom", linecolor = "red"
)
annoGenomeLabel(
plot = hicPlot,
x = 0.25, y = 3.01
)
We can either annotate single domains or multiple domains at once
depending on the data
input.
The last category of annotations that is often used in plotting genomic data is highlighting and zooming. Many figures benefit from providing a broader context of data and then highlighting a smaller genomic region to show data at a finer scale. In this example, we will plot an ideogram and highlight and zoom in on a genomic region of interest to see the signal track data in that region.
First we can plot our ideogram:
library(AnnotationHub)
library(TxDb.Hsapiens.UCSC.hg19.knownGene)
pageCreate(
width = 6.25, height = 2.25, default.units = "inches",
showGuides = FALSE, xgrid = 0, ygrid = 0
)
ideogramPlot <- plotIdeogram(
chrom = "chr21", assembly = "hg19",
orientation = "h",
x = 0.25, y = 0.5, width = 5.75, height = 0.3, just = "left"
)
We can then use annoHighlight()
to highlight our genomic
region of interest (chr21:28000000-30300000
) with a box of
our desired height
:
region <- pgParams(chrom = "chr21", chromstart = 28000000, chromend = 30300000)
annoHighlight(
plot = ideogramPlot, params = region,
fill = "red",
y = 0.25, height = 0.5, just = c("left", "top"), default.units = "inches"
)
To make it clearer that we are zooming in on a genomic region, we can
then use annoZoomLines()
to add zoom lines from the genomic
region we highlighted:
annoZoomLines(
plot = ideogramPlot, params = region,
y0 = 0.75, x1 = c(0.25, 6), y1 = 1.25, default.units = "inches"
)
Finally, we can add our zoomed-in signal track data within the zoom lines:
sessionInfo()
#> R version 4.3.2 (2023-10-31)
#> Platform: x86_64-apple-darwin20 (64-bit)
#> Running under: macOS Sonoma 14.2.1
#>
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRblas.0.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
#>
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#>
#> time zone: America/New_York
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats4 grid stats graphics grDevices utils datasets
#> [8] methods base
#>
#> other attached packages:
#> [1] AnnotationHub_3.10.0
#> [2] BiocFileCache_2.10.1
#> [3] dbplyr_2.5.0
#> [4] BSgenome.Hsapiens.UCSC.hg19_1.4.3
#> [5] BSgenome_1.70.2
#> [6] rtracklayer_1.62.0
#> [7] BiocIO_1.12.0
#> [8] Biostrings_2.70.3
#> [9] XVector_0.42.0
#> [10] org.Hs.eg.db_3.18.0
#> [11] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2
#> [12] GenomicFeatures_1.54.4
#> [13] AnnotationDbi_1.64.1
#> [14] Biobase_2.62.0
#> [15] plotgardenerData_1.8.0
#> [16] GenomicRanges_1.54.1
#> [17] GenomeInfoDb_1.38.8
#> [18] IRanges_2.36.0
#> [19] S4Vectors_0.40.2
#> [20] BiocGenerics_0.48.1
#> [21] plotgardener_1.8.2
#>
#> loaded via a namespace (and not attached):
#> [1] RColorBrewer_1.1-3 strawr_0.0.91
#> [3] rstudioapi_0.16.0 jsonlite_1.8.8
#> [5] magrittr_2.0.3 rmarkdown_2.26
#> [7] fs_1.6.3 zlibbioc_1.48.2
#> [9] ragg_1.3.0 vctrs_0.6.5
#> [11] memoise_2.0.1 Rsamtools_2.18.0
#> [13] RCurl_1.98-1.14 htmltools_0.5.8
#> [15] S4Arrays_1.2.1 progress_1.2.3
#> [17] curl_5.2.1 SparseArray_1.2.4
#> [19] gridGraphics_0.5-1 sass_0.4.9
#> [21] bslib_0.7.0 desc_1.4.3
#> [23] cachem_1.0.8 GenomicAlignments_1.38.2
#> [25] mime_0.12 lifecycle_1.0.4
#> [27] pkgconfig_2.0.3 Matrix_1.6-5
#> [29] R6_2.5.1 fastmap_1.1.1
#> [31] GenomeInfoDbData_1.2.11 MatrixGenerics_1.14.0
#> [33] shiny_1.8.1 digest_0.6.35
#> [35] colorspace_2.1-0 textshaping_0.3.7
#> [37] RSQLite_2.3.5 filelock_1.0.3
#> [39] fansi_1.0.6 httr_1.4.7
#> [41] abind_1.4-5 compiler_4.3.2
#> [43] bit64_4.0.5 withr_3.0.0
#> [45] BiocParallel_1.36.0 DBI_1.2.2
#> [47] highr_0.10 biomaRt_2.58.2
#> [49] rappdirs_0.3.3 DelayedArray_0.28.0
#> [51] rjson_0.2.21 tools_4.3.2
#> [53] interactiveDisplayBase_1.40.0 httpuv_1.6.15
#> [55] glue_1.7.0 restfulr_0.0.15
#> [57] promises_1.2.1 generics_0.1.3
#> [59] gtable_0.3.4 data.table_1.15.2
#> [61] hms_1.1.3 xml2_1.3.6
#> [63] utf8_1.2.4 BiocVersion_3.18.1
#> [65] pillar_1.9.0 stringr_1.5.1
#> [67] yulab.utils_0.1.4 later_1.3.2
#> [69] dplyr_1.1.4 lattice_0.22-6
#> [71] bit_4.0.5 tidyselect_1.2.1
#> [73] knitr_1.45 SummarizedExperiment_1.32.0
#> [75] xfun_0.43 matrixStats_1.2.0
#> [77] stringi_1.8.3 yaml_2.3.8
#> [79] evaluate_0.23 codetools_0.2-19
#> [81] tibble_3.2.1 BiocManager_1.30.22
#> [83] ggplotify_0.1.2 cli_3.6.2
#> [85] xtable_1.8-4 systemfonts_1.0.6
#> [87] munsell_0.5.0 jquerylib_0.1.4
#> [89] Rcpp_1.0.12 png_0.1-8
#> [91] XML_3.99-0.16.1 parallel_4.3.2
#> [93] pkgdown_2.0.7 ggplot2_3.5.0
#> [95] blob_1.2.4 prettyunits_1.2.0
#> [97] plyranges_1.22.0 bitops_1.0-7
#> [99] scales_1.3.0 purrr_1.0.2
#> [101] crayon_1.5.2 rlang_1.1.3
#> [103] KEGGREST_1.42.0