Compiled date: 2021-02-01
Last edited: 2020-04-20
License: MIT + file LICENSE
One of iSEE’s main features is the ability to share information between panels.
This facilitates deeper exploration of a dataset by allowing users to visualize relationships across multiple metrics.
iSEE()
currently supports three modes of information sharing between panels - multiple selections, single selections and dynamic selections - which are demonstrated in this vignette using the Allen dataset processed in the previous vignette.
As its name suggests, this involves selecting multiple features or samples in one panel and transmitting their identities to another panel to affect the visualization. To demonstrate, we will create a small app involving a single reduced dimension plot and a column metadata plot.
library(iSEE)
app <- iSEE(sce, initial=list(
ReducedDimensionPlot(),
ColumnDataPlot()
))
We indicate that we want one panel to “receive” a multiple selection from another panel. This is done by specifying the selection source (for samples/columns in this case, given the nature of the two panels) and indicating that the column data plot is to receive a selection from the reduced dimension plot.
We can click-and-drag to select multiple points in the reduced dimension plot with a brush,
which highlights those same points in the column data plot.
This enables users to easily explore relationships between different visualizations in the iSEE()
interface.
Alternatively, a single click will lay down lasso waypoints for a non-rectangular selection. Once closed, the points in the lasso will be transmitted to the column data plot.
Transparency is the default aesthetic effect used to distinguish points in multiple selections in receiving plots. Alternatively, we may use color:
Another option is to restrict the receiving plot so that it only shows the points in the multiple selection. This effectively “gates” the dataset on the selection in the reduced dimension plot, analogous to identification populations of interest in flow cytometry studies. Indeed, this gating process can be repeated as many times as desired; a multiple selection could made on the column data plot and transmitted to another panel, and so on. (See this mass cytometry tour for an example.)
Of course, not all receiving panels need to be plots. If we transmit a multiple selection to a column data table, the effect is to subset the rows of the table corresponding to the selected points.
As an aside, it is equally possible for a table to transmit a multiple selection to other panels. This is achieved using the search fields to subset the dataset to the desired selection.
In certain panels (usually plots), multiple selections can be saved to form disjoint selections. Receiving plots can then choose to respond to the union of all selections, just the active selection, or one of the saved selections. For example, here the column data plot is responding to the union of all selections.
The saved selection history operates on a first-in-last-out basis. Upon saving, a snapshot is taken of the current “active” selection, i.e., the brush or lasso that is just created. Deletion will only operate on the last saved selection.
Another mode of information sharing involves transmitting a selection of a single feature or sample. This allows users to conveniently direct other panels to focus on a feature or sample of interest. For example, we can transmit a single selection from a row data table to a reduced dimension plot, instructing the latter to color points by the expression of the chosen feature.
The same approach can be used to control what is plotted on a feature assay plot.
Clicking on a different row of the table will directly change the axes (in this case, the y-axis) of the plot,
allowing the user to synchronise different aspects of the iSEE()
interface to whatever is currently of interest.
We can also perform single selections on sample identities. In the example below, the reduced dimension plot highlights the location of the sample chosen in the column data table. This is useful for checking the behavior of specific samples of interest, e.g., during quality control.
Furthermore, it is possible to transmit single selections from a plot using brushes or lassos. If the brush/lasso contains multiple points, one of them is arbitrarily chosen for the purposes of obtaining a single selection. Below, we select a single highly variable gene to examine its distribution of expression values across the reduced dimension plot.
Most panels will have an option to dynamically change the choice of transmitting panel according to the last active selection in the app. This allows users to, for example, simply brush on any plot in the app and have all participating receiving panels immediately use that selection without requiring manual resetting of the transmitter. To illustrate, let’s set up an instance with three different plots that all represent points as samples.
Notice how we have checked the dynamic source selection option in the selection parameter box for all panels. This means that, upon making a selection in any one of the plots, all of the other plots will automatically respond as if they had been manually set to receive a transmission from that plot.
The same logic applies for some parameters that respond to single selections. This allows a panel to respond to an appropriate single selection from any other panel in the interface, without requiring the user to manually set the relationship between panels. In the example below, users can easily define the y-axis of the feature assay plot from a selected row in the row data table or from a selected single point in the row data plot.
sessionInfo()
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-pc-linux-gnu (64-bit)
#> Running under: Ubuntu 18.04.5 LTS
#>
#> Matrix products: default
#> BLAS: /home/biocbuild/bbs-3.12-bioc/R/lib/libRblas.so
#> LAPACK: /home/biocbuild/bbs-3.12-bioc/R/lib/libRlapack.so
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_US.UTF-8 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] parallel stats4 stats graphics grDevices utils datasets
#> [8] methods base
#>
#> other attached packages:
#> [1] TENxPBMCData_1.8.0 HDF5Array_1.18.0
#> [3] rhdf5_2.34.0 DelayedArray_0.16.1
#> [5] Matrix_1.3-2 scater_1.18.3
#> [7] ggplot2_3.3.3 scRNAseq_2.4.0
#> [9] iSEE_2.2.4 SingleCellExperiment_1.12.0
#> [11] SummarizedExperiment_1.20.0 Biobase_2.50.0
#> [13] GenomicRanges_1.42.0 GenomeInfoDb_1.26.2
#> [15] IRanges_2.24.1 S4Vectors_0.28.1
#> [17] BiocGenerics_0.36.0 MatrixGenerics_1.2.1
#> [19] matrixStats_0.58.0 BiocStyle_2.18.1
#>
#> loaded via a namespace (and not attached):
#> [1] circlize_0.4.12 AnnotationHub_2.22.0
#> [3] BiocFileCache_1.14.0 igraph_1.2.6
#> [5] lazyeval_0.2.2 shinydashboard_0.7.1
#> [7] splines_4.0.3 BiocParallel_1.24.1
#> [9] digest_0.6.27 ensembldb_2.14.0
#> [11] htmltools_0.5.1.1 viridis_0.5.1
#> [13] magrittr_2.0.1 memoise_2.0.0
#> [15] cluster_2.1.0 ComplexHeatmap_2.6.2
#> [17] Biostrings_2.58.0 askpass_1.1
#> [19] prettyunits_1.1.1 colorspace_2.0-0
#> [21] blob_1.2.1 rappdirs_0.3.3
#> [23] ggrepel_0.9.1 xfun_0.20
#> [25] dplyr_1.0.3 crayon_1.4.0
#> [27] RCurl_1.98-1.2 jsonlite_1.7.2
#> [29] glue_1.4.2 gtable_0.3.0
#> [31] zlibbioc_1.36.0 XVector_0.30.0
#> [33] GetoptLong_1.0.5 BiocSingular_1.6.0
#> [35] Rhdf5lib_1.12.1 shape_1.4.5
#> [37] scales_1.1.1 DBI_1.1.1
#> [39] miniUI_0.1.1.1 Rcpp_1.0.6
#> [41] viridisLite_0.3.0 xtable_1.8-4
#> [43] progress_1.2.2 clue_0.3-58
#> [45] rsvd_1.0.3 bit_4.0.4
#> [47] DT_0.17 htmlwidgets_1.5.3
#> [49] httr_1.4.2 RColorBrewer_1.1-2
#> [51] shinyAce_0.4.1 ellipsis_0.3.1
#> [53] scuttle_1.0.4 pkgconfig_2.0.3
#> [55] XML_3.99-0.5 sass_0.3.1
#> [57] dbplyr_2.0.0 tidyselect_1.1.0
#> [59] rlang_0.4.10 later_1.1.0.1
#> [61] AnnotationDbi_1.52.0 munsell_0.5.0
#> [63] BiocVersion_3.12.0 tools_4.0.3
#> [65] cachem_1.0.1 generics_0.1.0
#> [67] RSQLite_2.2.3 ExperimentHub_1.16.0
#> [69] rintrojs_0.2.2 evaluate_0.14
#> [71] stringr_1.4.0 fastmap_1.1.0
#> [73] yaml_2.2.1 knitr_1.31
#> [75] bit64_4.0.5 purrr_0.3.4
#> [77] AnnotationFilter_1.14.0 sparseMatrixStats_1.2.0
#> [79] nlme_3.1-151 mime_0.9
#> [81] xml2_1.3.2 biomaRt_2.46.2
#> [83] compiler_4.0.3 beeswarm_0.2.3
#> [85] curl_4.3 png_0.1-7
#> [87] interactiveDisplayBase_1.28.0 tibble_3.0.6
#> [89] bslib_0.2.4 stringi_1.5.3
#> [91] highr_0.8 GenomicFeatures_1.42.1
#> [93] lattice_0.20-41 ProtGenerics_1.22.0
#> [95] shinyjs_2.0.0 vctrs_0.3.6
#> [97] rhdf5filters_1.2.0 pillar_1.4.7
#> [99] lifecycle_0.2.0 BiocManager_1.30.10
#> [101] jquerylib_0.1.3 GlobalOptions_0.1.2
#> [103] BiocNeighbors_1.8.2 irlba_2.3.3
#> [105] bitops_1.0-6 httpuv_1.5.5
#> [107] rtracklayer_1.50.0 R6_2.5.0
#> [109] bookdown_0.21 promises_1.1.1
#> [111] gridExtra_2.3 vipor_0.4.5
#> [113] colourpicker_1.1.0 assertthat_0.2.1
#> [115] openssl_1.4.3 rjson_0.2.20
#> [117] shinyWidgets_0.5.6 withr_2.4.1
#> [119] GenomicAlignments_1.26.0 Rsamtools_2.6.0
#> [121] GenomeInfoDbData_1.2.4 mgcv_1.8-33
#> [123] hms_1.0.0 beachmat_2.6.4
#> [125] grid_4.0.3 DelayedMatrixStats_1.12.2
#> [127] rmarkdown_2.6 Rtsne_0.15
#> [129] Cairo_1.5-12.2 shiny_1.6.0
#> [131] ggbeeswarm_0.6.0