Contents

Metaviz is tool for interactive visualization and exploration of metagenomic sequencing data. Metaviz a provides main navigation tool for exploring hierarchical feature data that is coupled with multiple data visualizations including heatmaps, stacked bar charts, and scatter plots. Metaviz supports a flexible plugin framework so users can add new d3 visualizations. You can find more information about Metaviz at http://metaviz.cbcb.umd.edu/help.

The metavizr package implements two-way communication between the R/Bioconductor computational genomics environment and Metaviz. Objects in an R/Bioconductor session can be visualized and explored using the Metaviz navigation tool and plots. Metavizr uses Websockets to communicate between the browser Javascript client and the R/Bioconductor session. Websockets are the protocols underlying the popular Shiny system for authoring interactive web-based reports in R.

1 Preliminaries: the data

In this vignette we will look at two data sets one from a case/control study and another with a time series. We load the first data set from the msd16s Bioconductor package. This data is from the Moderate to Severe Diaherrial disease study in children from four countries: Banglash, Kenya, Mali, and the Gambia. Case and control stool samples were gathered from each country across several age ranges, 0-6 months, 6-12 months, 12-18 months, 18-24 months, and 24-60 months. An analysis of this data is described in Pop et al. [1].

require(metavizr)
require(metagenomeSeq)
require(msd16s)

2 The metavizr session manager

The connection to Metaviz is managed through a session manager object of class EpivizApp. We can create this object and open Metaviz using the startMetaviz function.

app <- startMetaviz()

NOTE: The following commands are not visible when building the vignette. These commands are for registering each chart type so that the vignette will build when starting a new Metaviz session using localhost. These commands are not needed if using startMetaviz with default which starts a Metaviz session using http://metaviz.cbcb.umd.edu.

This opens a websocket connection between the interactive R session and the browser client. This will allow us to visualize data stored in the Metaviz server along with data in the interactive R session.


Windows users: In Windows platforms we need to use the service function to let the interactive R session connect to the epiviz web app and serve data requests. We then escape (using ctl-c or esc depending on your environment) to continue with the interactive R session. This is required anytime you want metavizr to serve data to the web app, for example, when interacting with the UI. (We are actively developing support for non-blocking sessions in Windows platforms).

app$server$service()

For vignette purposes, we will subset the 992 msd16s samples to those 301 from Bangladesh. Also, we will aggregate the count matrix to the species level. We have found that matrix sizes with 100 samples and 4000 features perform well for interactive visualization with an R session using WebSockets. For larger abundance matrices, we recommend using the graph database backend available at https://github.com/epiviz/metaviz-data-provider. Once having subset the data, we set the aggregation level to “class”, normalize, find features differentially abundant at the “class” level, propagate those selections to an MRexperiment that is aggreagted to “species” level, and then explore the hiearchy.

feature_order <- c("superkingdom", "phylum", "class", "order", "family", "genus", "species", "OTU")
aggregated_feature_order <- feature_order[1:7]

msd16s_species <- msd16s
fData(msd16s) <- fData(msd16s)[feature_order]
fData(msd16s_species) <- fData(msd16s_species)[aggregated_feature_order]
  
bangladesh <- msd16s[, which(pData(msd16s)$Country == "Bangladesh")]
bangladesh_species <- msd16s_species[, which(pData(msd16s_species)$Country == "Bangladesh")]

aggregated_species <-  cumNorm(aggregateByTaxonomy(bangladesh_species, lvl="species"), p = 0.75)

aggregation_level <- "class"
aggregated_bangladesh <- aggregateByTaxonomy(bangladesh, lvl=aggregation_level)

normed_bangladesh <-  cumNorm(aggregated_bangladesh, p = 0.75)
bangladesh_sample_data <-  pData(normed_bangladesh)
mod <-  model.matrix(~1+Dysentery, data = bangladesh_sample_data)
results_bangladesh <-  fitFeatureModel(normed_bangladesh, mod)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
logFC_bangladesh <- MRcoefs(results_bangladesh, number = nrow(normed_bangladesh))

features <- rownames(logFC_bangladesh)
featuresToKeep_names <- features[which(logFC_bangladesh[which(abs(logFC_bangladesh$logFC) > 1),]$adjPvalues < .1)]
featuresToKeep <- rep(2, length(featuresToKeep_names))
names(featuresToKeep) <- featuresToKeep_names

featuresToRemove_names <- features[!(features %in% featuresToKeep_names)]
featuresToRemove <- rep(0, length(featuresToRemove_names))
names(featuresToRemove) <- featuresToRemove_names

A metavizControl allows users to specify settings for operating over the MRexperiment object including data analysis such as normalization and log transform. We create a metavizControl with the featureSelection as the nodes that be found to be differentially abundant and those will be visible when creating Metaviz plots. The rest of the settings in the metavizControl will use the default parameters.

control <- metavizr::metavizControl(featureSelection = c(featuresToKeep, featuresToRemove))

3 Adding an Icicle navigation widget to explore metagenomic features

Once the browser is open we can visualize the metagenomic features from the mouseData object. We use the plot method to do so. The plot function can take as input any of the classes registered with epivirData.

#specify the feature hierarchy for the dataset
icicle_plot <- app$plot(aggregated_species, datasource_name="mmssdd", type = "LeafCounts", control = control, feature_order = aggregated_feature_order)
## MRExperiment Object validated... PASS
## creating hierarchy_tree
## creating node_ids_table
## creating nodes_table
## creating leaf_of_table
## creating leaf_sample_count_table

You should now see an icicle widget to explore the hierarchy of the metagenomic features from the mouseData object. To navigate the complex, hierarchical structure of the feature space, we developed an icicle/facet zoom visualization. Because of the limitations in the screen size and performance rendering big trees, the icicle plot is an efficient visualization for navigating trees. The icicle visualization helps zoom in and out of trees and traverse subtrees. Every node in the icicle has a state associated with it. There are three possible states for a node 1) expand - use all subtree nodes during analysis 2) collapse - aggregate all nodes under the subtree to the selected node 3) remove - discard all nodes in the subtree for the analysis. The state of a node is also propagated to all its children and can be identified by the opacity of the node. Row level controls are available to the left of the icicle - to set the state of all nodes at a selected depth/taxonomic class of the hierarchy. Icicle is traversible if the ends on the row controls are chevrons. Users can set states on the nodes to define a cut over the feature space. The cut defines how the count data is queried, analyzed and visualized in other plots like heat maps or stacked line plots. In addition to defining the cut, we also have a navigation bar on top of the icicle to limit the range of features when querying for count data. Navigation bar is a flexible component (increase/decrease the length) and controls are available to move the bar left/right and extend over the entire range of the current tree in the icicle. Each of these actions would query the count data and automatically propagate the changes to other visualizations in the workspace. When navigating outside the scope of the navigation bar, chevrons (left/right) appear on the navigation bar to help identify the current position. Brushing/hovering is another important visual element we focused on our implementation of an icicle. Hovering over a node hovers its path in the tree i.e. highlight both its parents and children. When there are other visualizations like heat maps or stacked line plots in the workspace, hovering over a chart element highlights the mapped feature nodes in all the other plots.

4 Visualizing count data from the mouseData MRExperiment object

Now we can view the data as a heatmap calling revisualize:

heatmap <- app$chart_mgr$revisualize(chart_type = "HeatmapPlot", chart = icicle_plot)

Using the same data, we can also revisualize it in a stacked plot to see the abundance of various features across samples. Since the measurements are added from creating the icicle_plot, we only need to add a stacked line plot.

stackedPlot <- app$chart_mgr$revisualize(chart_type ="StackedLinePlot", chart = icicle_plot)

Finally, we can update the threshold cutoff we had for fold change, pass those modifications the icicle plot, and see the updates propogate to the heat map and stacked plot. This shows the use case of statistically-guided interactive visualizations.

feature_names_update <- rownames(logFC_bangladesh[which(logFC_bangladesh[which(abs(logFC_bangladesh$logFC) > .5),]$adjPvalues < .05),])
fSelection_update <- rep(2, length(feature_names_update))
names(fSelection_update) <- feature_names_update

agg_level = which(feature_order==aggregation_level)
select_value = 2
names(select_value) = agg_level
app$get_ms_object(icicle_plot)$propagateHierarchyChanges(fSelection_update, selectedLevels = select_value, request_with_labels = TRUE)

5 Longitudinal Data Analysis

Another feature of metavizr is to visualize data using a line plot. We detail the steps to perform this analysis and create a line plot using Metaviz such as those used in Paulson et al. when analyzing this time series data with a smoothing-spline [2] and [3].

First, import the etec16s dataset, select sample data from the first 9 days, and choose the feature annotations of interest.

library(etec16s)
data(etec16s)
etec16s <- etec16s[,-which(pData(etec16s)$Day>9)]

Next, use metagenomeSeq to fit a smoothing-spline to the time series data.

featureData(etec16s)$Kingdom <- "Bacteria"
feature_order <- c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species", "OTU.ID")
featureData(etec16s) <- featureData(etec16s)[,feature_order]

For plotting the data using Metaviz, we set the fit values as y-coordinates and timepoints as x-coordinates. We need to call ts2MRexperiment with arguments for the sample and feature data, in this case timepoints and annotations, respectively. This is done in the constructor for EpivizMetagenomicsDataTimeSeries-class. Finally, we add the MRexperiment as a measurement using the add_measurements method and then visualize those measurements as a LinePlot.

ic_plot <- app$plot(object = etec16s, type = "TimeSeries", datasource_name = "etec_splines", control = metavizControl(norm=FALSE, aggregateAtDepth = 4), formula = abundance~id + time*class + AntiGiven, class="AnyDayDiarrhea", id="SubjectID", time="Day", lvl="Family", feature_order = feature_order, B=1, seed = 1234, runFitTimeSeries = TRUE, fitThreshold = 2)
## Loading required namespace: gss
## MRExperiment Object validated... PASS
## creating hierarchy_tree
## creating node_ids_table
## creating nodes_table
## creating leaf_of_table
## creating leaf_sample_count_table
splineChart <- app$chart_mgr$revisualize("LinePlot", ic_plot)

We can update the colors and settings on the spline chart. For example, lets limit the y axis to be between -10 and 10. To do so we use the set_chart_settings method. We can list existing settings for a chart using the list_chart_settings function.

##                           type                              js_class
## 1                  HeatmapPlot     epiviz.plugins.charts.HeatmapPlot
## 2                     LinePlot        epiviz.plugins.charts.LinePlot
## 3              StackedLinePlot epiviz.plugins.charts.StackedLinePlot
## 4 epiviz.ui.charts.tree.Icicle          epiviz.ui.charts.tree.Icicle
##   num_settings
## 1           17
## 2           16
## 3           14
## 4            5
##                                                                              settings
## 1 title,marginTop,marginBottom,marginLeft,marginRight,measurementGroupsAggregator,...
## 2 title,marginTop,marginBottom,marginLeft,marginRight,measurementGroupsAggregator,...
## 3 title,marginTop,marginBottom,marginLeft,marginRight,measurementGroupsAggregator,...
## 4                                 title,marginTop,marginBottom,marginLeft,marginRight
##   num_colors
## 1          8
## 2         20
## 3         20
## 4         10
##                             id                             label default_value
## 1                        title                             Title              
## 2                    marginTop                        Top margin            30
## 3                 marginBottom                     Bottom margin            50
## 4                   marginLeft                       Left margin            30
## 5                  marginRight                      Right margin            15
## 6  measurementGroupsAggregator Aggregator for measurement groups    mean-stdev
## 7                     colLabel                    Columns labels      colLabel
## 8                     rowLabel                        Row labels          name
## 9                   showPoints                       Show points         FALSE
## 10                   showLines                        Show lines          TRUE
## 11               showErrorBars                   Show error bars          TRUE
## 12                 pointRadius                      Point radius             4
## 13               lineThickness                    Line thickness             3
## 14                        yMin                             Min Y       default
## 15                        yMax                             Max Y       default
## 16               interpolation                     Interpolation         basis
##                                                                                       possible_values
## 1                                                                                                    
## 2                                                                                                    
## 3                                                                                                    
## 4                                                                                                    
## 5                                                                                                    
## 6                                                              mean-stdev,quartiles,count,min,max,sum
## 7                                                                                                    
## 8                                                                                                    
## 9                                                                                                    
## 10                                                                                                   
## 11                                                                                                   
## 12                                                                                                   
## 13                                                                                                   
## 14                                                                                                   
## 15                                                                                                   
## 16 linear,step-before,step-after,basis,basis-open,basis-closed,bundle,cardinal,cardinal-open,monotone
##                      type
## 1                  string
## 2                  number
## 3                  number
## 4                  number
## 5                  number
## 6             categorical
## 7    measurementsMetadata
## 8  measurementsAnnotation
## 9                 boolean
## 10                boolean
## 11                boolean
## 12                 number
## 13                 number
## 14                 number
## 15                 number
## 16            categorical
Spline metavizr

Spline metavizr

6 Visualize Whole Metagenome Shotgun Sequencing using data from curatedMetagenomicData

Beyond marker-gene survey sequencing results, Metaviz can visualize taxonomic community profiles from whole metagenome shotgun sequencing. In order to show this utility, we will use select portions of the vignette for a Bioconductor 2017 workshop found here: https://github.com/waldronlab/MicrobiomeWorkshop. We first retrieve a dataset named Zeller_2014 from curatedMetagenomicData and convert the ExpressionSet containing abundance measurements into an MRExperiment which we will then use with Metaviz.

## Loading required package: ExperimentHub
## Loading required package: AnnotationHub
## Loading required package: BiocFileCache
## Loading required package: dbplyr
## 
## Attaching package: 'AnnotationHub'
## The following object is masked from 'package:Biobase':
## 
##     cache
## Loading required package: tidyr
## 
## Attaching package: 'tidyr'
## The following objects are masked from 'package:Matrix':
## 
##     expand, pack, unpack
## snapshotDate(): 2021-10-18
## see ?curatedMetagenomicData and browseVignettes('curatedMetagenomicData') for documentation
## loading from cache

We add the MRExperiment to the Metaviz app with a call to plot with the type = “innerNodeCounts” specified.

## MRExperiment Object validated... PASS
## creating hierarchy_tree
## creating node_ids_table
## creating nodes_table
## creating leaf_sample_count_table

A FacetZoom utility is now visible for the taxonomic hierarchy of the Zeller_2014 dataset. Now we can add a heatmap for abundance measurments for that data.

The FacetZoom control can be used to select features of interest to show in the linked heatmap. A user can explore at lower levels of the taxonomic hierarchy and remove nodes as desired from the data visualizations. We complete, all charts can be removed with a call to the Metaviz app chart manager.

6.0.1 Close Metavizr and end session

To close the connection with metaviz and the R session, we use the stop_app function.

app$stop_app()

6.0.2 SessionInfo

sessionInfo()
## R version 4.1.1 (2021-08-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
## 
## Matrix products: default
## BLAS:   /home/biocbuild/bbs-3.14-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.14-bioc/R/lib/libRlapack.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_GB              LC_COLLATE=C              
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] curatedMetagenomicData_3.1.12  TreeSummarizedExperiment_2.2.0
##  [3] Biostrings_2.62.0              XVector_0.34.0                
##  [5] SingleCellExperiment_1.16.0    SummarizedExperiment_1.24.0   
##  [7] GenomicRanges_1.46.0           GenomeInfoDb_1.30.0           
##  [9] IRanges_2.28.0                 S4Vectors_0.32.0              
## [11] MatrixGenerics_1.6.0           matrixStats_0.61.0            
## [13] tidyr_1.1.4                    ExperimentHub_2.2.0           
## [15] AnnotationHub_3.2.0            BiocFileCache_2.2.0           
## [17] dbplyr_2.1.1                   etec16s_1.21.0                
## [19] msd16s_1.13.0                  metavizr_1.18.0               
## [21] digest_0.6.28                  data.table_1.14.2             
## [23] metagenomeSeq_1.36.0           RColorBrewer_1.1-2            
## [25] glmnet_4.1-2                   Matrix_1.3-4                  
## [27] limma_3.50.0                   Biobase_2.54.0                
## [29] BiocGenerics_0.40.0            BiocStyle_2.22.0              
## 
## loaded via a namespace (and not attached):
##   [1] utf8_1.2.2                    tidyselect_1.1.1             
##   [3] RSQLite_2.2.8                 AnnotationDbi_1.56.0         
##   [5] grid_4.1.1                    BiocParallel_1.28.0          
##   [7] munsell_0.5.0                 ScaledMatrix_1.2.0           
##   [9] codetools_0.2-18              withr_2.4.2                  
##  [11] colorspace_2.0-2              filelock_1.0.2               
##  [13] OrganismDbi_1.36.0            phyloseq_1.38.0              
##  [15] knitr_1.36                    GenomeInfoDbData_1.2.7       
##  [17] bit64_4.0.5                   rhdf5_2.38.0                 
##  [19] vctrs_0.3.8                   treeio_1.18.0                
##  [21] generics_0.1.1                xfun_0.27                    
##  [23] R6_2.5.1                      ggbeeswarm_0.6.0             
##  [25] rsvd_1.0.5                    locfit_1.5-9.4               
##  [27] AnnotationFilter_1.18.0       bitops_1.0-7                 
##  [29] rhdf5filters_1.6.0            cachem_1.0.6                 
##  [31] DelayedArray_0.20.0           assertthat_0.2.1             
##  [33] promises_1.2.0.1              BiocIO_1.4.0                 
##  [35] scales_1.1.1                  beeswarm_0.4.0               
##  [37] gtable_0.3.0                  beachmat_2.10.0              
##  [39] ensembldb_2.18.0              rlang_0.4.12                 
##  [41] splines_4.1.1                 rtracklayer_1.54.0           
##  [43] lazyeval_0.2.2                epivizrData_1.22.0           
##  [45] BiocManager_1.30.16           yaml_2.2.1                   
##  [47] reshape2_1.4.4                GenomicFeatures_1.46.0       
##  [49] httpuv_1.6.3                  RBGL_1.70.0                  
##  [51] tools_4.1.1                   bookdown_0.24                
##  [53] ggplot2_3.3.5                 decontam_1.14.0              
##  [55] ellipsis_0.3.2                gplots_3.1.1                 
##  [57] jquerylib_0.1.4               biomformat_1.22.0            
##  [59] Rcpp_1.0.7                    plyr_1.8.6                   
##  [61] sparseMatrixStats_1.6.0       progress_1.2.2               
##  [63] zlibbioc_1.40.0               purrr_0.3.4                  
##  [65] RCurl_1.98-1.5                prettyunits_1.1.1            
##  [67] Wrench_1.12.0                 viridis_0.6.2                
##  [69] epivizrStandalone_1.22.0      ggrepel_0.9.1                
##  [71] cluster_2.1.2                 DECIPHER_2.22.0              
##  [73] magrittr_2.0.1                ProtGenerics_1.26.0          
##  [75] hms_1.1.1                     mime_0.12                    
##  [77] evaluate_0.14                 xtable_1.8-4                 
##  [79] XML_3.99-0.8                  gridExtra_2.3                
##  [81] shape_1.4.6                   compiler_4.1.1               
##  [83] biomaRt_2.50.0                scater_1.22.0                
##  [85] gss_2.2-3                     tibble_3.1.5                 
##  [87] KernSmooth_2.23-20            crayon_1.4.1                 
##  [89] htmltools_0.5.2               mgcv_1.8-38                  
##  [91] later_1.3.0                   DBI_1.1.1                    
##  [93] MASS_7.3-54                   rappdirs_0.3.3               
##  [95] ade4_1.7-18                   epivizrServer_1.22.0         
##  [97] permute_0.9-5                 parallel_4.1.1               
##  [99] igraph_1.2.7                  pkgconfig_2.0.3              
## [101] GenomicAlignments_1.30.0      scuttle_1.4.0                
## [103] xml2_1.3.2                    foreach_1.5.1                
## [105] DirichletMultinomial_1.36.0   vipor_0.4.5                  
## [107] bslib_0.3.1                   multtest_2.50.0              
## [109] mia_1.2.0                     stringr_1.4.0                
## [111] vegan_2.5-7                   graph_1.72.0                 
## [113] rmarkdown_2.11                tidytree_0.3.5               
## [115] epivizr_2.24.0                DelayedMatrixStats_1.16.0    
## [117] restfulr_0.0.13               curl_4.3.2                   
## [119] shiny_1.7.1                   Rsamtools_2.10.0             
## [121] gtools_3.9.2                  rjson_0.2.20                 
## [123] lifecycle_1.0.1               nlme_3.1-153                 
## [125] jsonlite_1.7.2                Rhdf5lib_1.16.0              
## [127] BiocNeighbors_1.12.0          viridisLite_0.4.0            
## [129] fansi_0.5.0                   pillar_1.6.4                 
## [131] lattice_0.20-45               KEGGREST_1.34.0              
## [133] fastmap_1.1.0                 httr_1.4.2                   
## [135] survival_3.2-13               interactiveDisplayBase_1.32.0
## [137] glue_1.4.2                    png_0.1-7                    
## [139] iterators_1.0.13              BiocVersion_3.14.0           
## [141] bit_4.0.4                     stringi_1.7.5                
## [143] sass_0.4.0                    blob_1.2.2                   
## [145] BiocSingular_1.10.0           caTools_1.18.2               
## [147] memoise_2.0.0                 dplyr_1.0.7                  
## [149] irlba_2.3.3                   ape_5.5

References:

[1] Pop, M., Walker, A.W., Paulson, J., Lindsay, B., Antonio, M., Hossain, M.A., Oundo, J., Tamboura, B., Mai, V., Astrovskaya, I. and Bravo, H.C., 2014. Diarrhea in young children from low-income countries leads to large-scale alterations in intestinal microbiota composition. Genome biology, 15(6), p.1.

[2] Pop, M., Paulson, J.N., Chakraborty, S., Astrovskaya, I., Lindsay, B.R., Li, S., Bravo, H.C., Harro, C., Parkhill, J., Walker, A.W. and Walker, R.I., 2016. Individual-specific changes in the human gut microbiota after challenge with enterotoxigenic Escherichia coli and subsequent ciprofloxacin treatment. BMC genomics, 17(1), p.1.

[3] Paulson J.N., Talukder H., and Bravo H.C, Longitudinal differential abundance analysis of microbial marker-gene surveys using smoothing splines. In Submission.