Compiled date: 2019-05-02
Last edited: 2018-03-08
License: MIT + file LICENSE
iSEE is a Bioconductor package that provides an interactive Shiny-based graphical user interface for exploring data stored in SummarizedExperiment
objects (Rue-Albrecht et al. 2018).
Instructions to install the package are available here.
Once installed, the package can be loaded and attached to your current workspace as follows:
library(iSEE)
If you have a SummarizedExperiment
object1 Or an instance of a subclass, like a SingleCellExperiment
object. named se
, you can launch an iSEE app by running:
iSEE(se)
In this vignette, we demonstrate this process using the allen
single-cell RNA-seq data set from the scRNAseq package.
However, if you want to start playing with the app immediately, you can simply run:
example(iSEE, ask=FALSE)
The allen
data set contains expression values for 379 cells from the mouse visual cortex (Tasic et al. 2016). To begin with, we load and inspect the allen
object.
library(scRNAseq)
data(allen)
allen
#> class: SummarizedExperiment
#> dim: 20908 379
#> metadata(2): SuppInfo which_qc
#> assays(4): tophat_counts cufflinks_fpkm rsem_counts rsem_tpm
#> rownames(20908): 0610007P14Rik 0610009B22Rik ... Zzef1 Zzz3
#> rowData names(0):
#> colnames(379): SRR2140028 SRR2140022 ... SRR2139341 SRR2139336
#> colData names(22): NREADS NALIGNED ... Animal.ID passes_qc_checks_s
As provided, the allen
object contains raw data and a number of quality control and experimental cell annotations, all available in colData(allen)
.
colnames(colData(allen))
#> [1] "NREADS" "NALIGNED"
#> [3] "RALIGN" "TOTAL_DUP"
#> [5] "PRIMER" "PCT_RIBOSOMAL_BASES"
#> [7] "PCT_CODING_BASES" "PCT_UTR_BASES"
#> [9] "PCT_INTRONIC_BASES" "PCT_INTERGENIC_BASES"
#> [11] "PCT_MRNA_BASES" "MEDIAN_CV_COVERAGE"
#> [13] "MEDIAN_5PRIME_BIAS" "MEDIAN_3PRIME_BIAS"
#> [15] "MEDIAN_5PRIME_TO_3PRIME_BIAS" "driver_1_s"
#> [17] "dissection_s" "Core.Type"
#> [19] "Primary.Type" "Secondary.Type"
#> [21] "Animal.ID" "passes_qc_checks_s"
Then, we convert the provided SummarizedExperiment
object to a SingleCellExperiment
object and normalize the expression values with scater.
library(scater)
sce <- as(allen, "SingleCellExperiment")
counts(sce) <- assay(sce, "tophat_counts")
sce <- normalize(sce)
Next, we apply PCA and t-SNE to generate two low-dimensional representations of the cells.
The dimensionality reduction results are stored in reducedDim(sce)
.
Note that all computations (e.g., dimension reduction, clustering) must be performed before passing the object to the iSEE
function.
sce <- runPCA(sce)
sce <- runTSNE(sce)
reducedDimNames(sce)
#> [1] "PCA" "TSNE"
At this point, the sce
object does not contain any annotations for the rows (i.e., features) in the data set.
Thus, to prepare a fully-featured example application, we also add some gene metadata to the rowData
related to the mean-variance relationship in the data.
rowData(sce)$mean_log <- rowMeans(logcounts(sce))
rowData(sce)$var_log <- apply(logcounts(sce), 1, var)
It is important to note that iSEE
relies solely2 Except when dealing with custom panels. on precomputed values in the SummarizedExperiment
object.
This allows users to visualize any metrics of interest, but also requires them to do so before the initialization of the app.
That said, it is straightforward to iteratively explore a precomputed object, take notes of new metrics to compute, close the app, store new results in the SummarizedExperiment
object, and launch a new app using the updated object.
To begin the exploration, we create an iSEE
app with the SingleCellExperiment
object generated above.
In its simplest form, the iSEE
function only requires the input object.
However, iSEE applications can be extensively reconfigured using a number of optional arguments to the iSEE
function.
app <- iSEE(sce)
The runApp
function launches the app in our browser.
shiny::runApp(app)
By default, the app starts with a dashboard that contains one panel or table of each type. By opening the collapsible panels named “Data parameters”, “Visual parameters”, and “Selection parameters” under each plot, we can control the content and appearance of each panel.
Now, look in the upper right corner for a question mark icon (), and click on the hand button () for an introductory tour. This will perform an interactive tour of the app, based on the rintrojs package (Ganz 2016). During this tour, you will be taken through the different components of the iSEE user interface and learn the basic usage mechanisms by doing small actions guided by the tutorial: the highlighted elements will be responding to your actions, while the rest of the UI will be shaded. You can move forward and backward along the tour by clicking on the “Next”/“Back” buttons, or also using the arrow keys. You can even jump to a particular step by clicking on its circle. To exit the tour, either click on “Skip”, or simply click outside of the highlighted UI element.
Once you are done generating plots, click on the wrench icon () in the upper right corner, and click on the magic wand button () to display R code that you can export and directly re-use in your R session. This will open a modal popup where the R code used to generate the plots is displayed in a shinyAce-based text editor. Select parts or all of it to copy-and-paste it into your analysis script/Rmarkdown file. However, note that the order in which the code blocks are reported is important if you have linked panels to one another, as the panels sending point selections must be executed before those that receive the corresponding selection.
The layout of the iSEE user interface uses the shinydashboard package. The dashboard header contains three dropdown menus.
The first is the “Diagnostics” dropdown menu, which is identified by a wrench icon () and contains:
sessionInfo()
commands for best tracking of your environment), and store it in your analysis report/script.
This code can then be further edited to finalize the plots (e.g., for publication).The “Documentation” dropdown menu is accessible through the question mark icon (), which contains:
The “Additional Information” dropdown menu is accessible through the information icon (), and contains:
sessionInfo()
function in a modal popup window.
This is particularly useful for reproducing or reporting the environment, especially when reporting errors or unexpected behaviors.The main element in the body of iSEE is the combination of panels, generated (and optionally linked to one another) according to your actions. There are currently eight standard panel types that can be generated with iSEE:
In addition, two custom panel types are available3 Those are described in a separate dedicated vignette.:
For each standard plot panel, three different sets of parameters will be available in collapsible boxes:
If a SingleCellExperiment
object is supplied to iSEE
, any reduced dimension results are extracted from the reducedDim
slot.
Examples include low-dimensional embeddings from principal components analysis (PCA) or t-distributed stochastic neighbour embedding (t-SNE) (Van der Maaten and Hinton 2008).
These results are used to construct a two-dimensional Reduced dimension plot where each point is a sample, to facilitate efficient exploration of high-dimensional datasets.
The “Data parameters” control the reducedDim
slot to be displayed, as well as the two dimensions to plot against each other.
Note that iSEE
does not compute reduced dimension embeddings; they must be precomputed and available in the object to the iSEE
function.
A Column data plot visualizes sample metadata stored in the SummarizedExperiment
column metadata.
Different fields can be used for the x- and y-axes by selecting appropriate values in the “Data parameters” box.
This plot can assume various forms, depending on the nature of the data on the x- and y-axes:
"Other"
box to see the available options.Note that an x-axis setting of “None” is considered to be categorical with a single level.
A Feature assay plot visualizes the assayed values (e.g., gene expression) for a particular feature (e.g., gene) across the samples on the y-axis.
This usually results in a (grouped) violin plot, if the x-axis is set to "None"
or a categorical variable; or a scatter plot, if the x-axis is another continuous variable4 That said, if there are categorical values for the assayed values, these will be handled as described in the column data plots..
Gene selection for the y-axis can be achieved by using a linked row statistics table in another panel.
Clicking on a row in the table automatically changes the assayed values plotted on the y-axis.
Alternatively, the row name can be directly entered as text that corresponds to an entry of rownames(se)
5 This is not effective if se
does not contain row names..
The x-axis covariate can also be selected from the plotting parameters. This can be "None"
, sample metadata, or the assayed values of another feature (also identified using a linked table or via text).
The measurement units are selected as one of the assays(se)
, which is applied to both the X and Y axes.
Obviously, any other assayed value for any feature can be visualized in this manner, not limited to the expression of genes.
The only requirement for this type of panel is that the observations can be stored as a matrix in the SummarizedExperiment
object.
A Row data plot allows the visualization of information stored in the rowData
slot of a SummarizedExperiment
object.
Its behavior mirrors the implementation for the Column data plot, and correspondingly this plot can assume various forms depending on whether the data are categorical or continuous.
A Sample assay plot visualizes the assayed values (e.g., gene expression) for a particular sample (e.g., cell) across the features on the y-axis.
This usually results in a (grouped) violin plot, if the x-axis is set to "None"
or a categorical variable (e.g., gene biotype); or a scatter plot, if the x-axis is another continuous variable.
Notably, the x-axis covariate can also be set to:
A Row statistics table contains the values of the rowData
slot for the SingleCellExperiment
/SummarizedExperiment
object.
If none are available, a column named Present
is added and set to TRUE
for all features, to avoid issues with DT::datatable
and an empty DataFrame
.
Typically, these tables are used to link to other plots to determine the features to use for plotting or coloring.
However, they can also be used to retrieve gene-specific annotation on the fly by specifying the annotFun
parameter, e.g. using the annotateEntrez
or annotateEnsembl
functions, provided in iSEE.
Alternatively, users can create a customized annotation function; for more details on this, please consult the manual pages ?annotateEntrez
and ?annotateEnsembl
.
A Column statistics table contains the values of the colData
slot for the SingleCellExperiment
/SummarizedExperiment
object.
Its behavior mirrors the implementation for the Row statistics table.
Correspondingly, if none are available, a column named Present
is added and set to TRUE
for all samples, to avoid issues with DT::datatable
and an empty DataFrame
.
Typically, these tables are used to link to other plots to determine the samples to use for plotting or coloring.
Heat map panels provide a compact overview of the data for multiple features in the form of color-coded matrices.
These correspond to the assays
stored in the SummarizedExperiment
object, where features (e.g., genes) are the rows and samples are the columns.
User can select features (rows) to display from the selectize widget (which supports autocompletion), or also via other panels, like row data plots or row statistics tables.
The “Suggest feature order” button clusters the rows, and also rearranges the elements in the selectize according to the clustering.
It is also possible to choose which assay type is displayed ("logcounts"
being the default choice, if available).
Samples in the heat map can also be annotated, simply by selecting relevant column metadata.
A zooming functionality is also available, restricted to the y-axis (i.e., allowing closer inspection on the individual features included).
Column-based plots are the reduced dimension, feature assay and column data plots, where each data point represents a sample. Here, data points can be colored in different ways:
"None"
in the radio button).
This results in data points of a constant user-specified color.colData(se)
can be used.
The plot automatically adjusts the scale to use based on whether the chosen column is continuous or categorical.assays
from which values are extracted.For row-based plots (i.e., the sample assay and row data plots), each data point represents a feature. Like the column-based plots, data points can be colored by:
"None"
, yielding data points of fixed color.rowData(se)
.Fine control of the color maps is possible through the ExperimentColorMap
class, see this vignette for more details.
Data points can be set to different shapes according to categorical factors in colData(se)
(for column-based plots) or rowData(se)
(for row-based plots).
This is achieved by checking the "Shape"
box to reveal the shape-setting options.
The size and opacity of the data points can be modified via the options available by checking the "Points"
box.
This may be useful for aesthetically pleasing visualizations when the number of points is very large or small.
It is also possible to downsample points to reduce the time required to generate the plot, via the "Downsample points for speed"
checkbox.
This uses density-dependent downsampling whereby only the last point for an overlapping set of points is shown.
In this manner, we avoid wasting time in plotting many points that would not be visible anyway.
Note that this is only effective when the point size is large and the opacity is set to unity.
Each point-based plot can be split into multiple facets using the options in the "Facets"
checkbox.
Users can facet by row and/or column, using categorical factors in colData(se)
(for column-based plots) or rowData(se)
(for row-based plots).
This provides a convenient way to stratify points in a single plot by multiple factors of interest.
Note that point selection can only occur within a single facet at a time; points cannot be selected across facets.
To link one plot to another, users can instruct a plotting panel to receive a selection of data points from another (transmitting) plot. This is done using the appropriate field in the “Selection parameters” box. Once this is done, data point selection on the transmitting plot affects the receiving plot in a variety of ways:
"Restrict"
, only the subset of points selected in the transmitter are visible in the receiver."Color"
, the selected subset of points is plotted in the receiver with a user-selected color."Transparent"
, the selected subset will be drawn with no transparency, while all non-selected points will be plotted with the specified alpha value.It is possible to set up a tree of panels that transmit selections to each other, much like the gating structures used in flow cytometry.
This requires all panels acting as both receivers and transmitters to have their effects set to "Restrict"
- see this mass cytometry tour for an example.
While we have focused above on receiving point selections for plots, it is also possible to transmit from plots to tables. This will subset the table so that only the rows corresponding to selected points are visible. Obviously, this means that users should only transmit from row-based plots to row statistics tables, and from column-based plots to column statistics tables.
Custom data panels can receive point selections from both row- and column-based plots, see here for more details.
Note that some panels are strictly “end-point” panels and cannot transmit - this includes heat maps, tables and custom data plots.
Zooming in is possible by first selecting a region of interest in a plot using the brush (drag and select); double-clicking on the brushed area then zooms into the selected area. To zoom out to the original plot, simply double-click at any location in the plot.
Q: Can you implement a ‘Copy to clipboard’ button in the code editor?
A: This is not necessary, as one can click anywhere in the code editor and instantly select all the code using a keyboard shortcut that depends on your operating system.
Q: When brushing with a transparency effect, it seems that data points in the receiving plot are not made transparent/subsetted correctly.
A: What you see is an artefact of overplotting: in areas excessively dense in points, transparency ceases to be an effective visual effect.
Q: Brushing on violin or square plots doesn’t seem to select anything.
A: For violin plots, points will be selected only if the brushed area includes the center of the x-tick, i.e., the center of the violin plot. This is intentional as it allows easy selection of all points in complex grouped violin plots. Indeed, the location of a specific point on the x-axis has no meaning. The same logic applies to the square plots, where only the center of each square needs to be selected to obtain all the points in the square.
Q: I’d like to try iSEE but I can’t install it/I just want a quick peek. Is there something you can do?
A: We set up an instance of iSEE running on the allen
dataset at this address: http://shiny.imbei.uni-mainz.de:3838/iSEE.
A range of interactive tours showcasing a variety of data types is also available here: https://github.com/LTLA/iSEE2018.
Please keep in mind this is only for demonstration purposes, yet those instances show how you or your system administrator can setup iSEE for analyzing and/or sharing your SummarizedExperiment
/SingleCellExperiment
precomputed object.
Bug reports can be posted on the Bioconductor support site or raised as issues in the iSEE GitHub repository. The GitHub repository also contains the development version of the package, where new functionality is added over time. The authors appreciate well-considered suggestions for improvements or new features, or even better, pull requests.
If you use iSEE for your analysis, please cite it as shown below:
citation("iSEE")
#>
#> Rue-Albrecht K, Marini F, Soneson C, Lun ATL (2018). "iSEE:
#> Interactive SummarizedExperiment Explorer." _F1000Research_, *7*,
#> 741. doi: 10.12688/f1000research.14966.1 (URL:
#> https://doi.org/10.12688/f1000research.14966.1).
#>
#> A BibTeX entry for LaTeX users is
#>
#> @Article{,
#> title = {iSEE: Interactive SummarizedExperiment Explorer},
#> author = {Kevin Rue-Albrecht and Federico Marini and Charlotte Soneson and Aaron T. L. Lun},
#> publisher = {F1000 Research, Ltd.},
#> journal = {F1000Research},
#> year = {2018},
#> month = {Jun},
#> volume = {7},
#> pages = {741},
#> doi = {10.12688/f1000research.14966.1},
#> }
sessionInfo()
#> R version 3.6.0 (2019-04-26)
#> Platform: x86_64-pc-linux-gnu (64-bit)
#> Running under: Ubuntu 18.04.2 LTS
#>
#> Matrix products: default
#> BLAS: /home/biocbuild/bbs-3.9-bioc/R/lib/libRblas.so
#> LAPACK: /home/biocbuild/bbs-3.9-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] scater_1.12.0 ggplot2_3.1.1
#> [3] scRNAseq_1.9.0 iSEE_1.4.0
#> [5] SingleCellExperiment_1.6.0 SummarizedExperiment_1.14.0
#> [7] DelayedArray_0.10.0 BiocParallel_1.18.0
#> [9] matrixStats_0.54.0 Biobase_2.44.0
#> [11] GenomicRanges_1.36.0 GenomeInfoDb_1.20.0
#> [13] IRanges_2.18.0 S4Vectors_0.22.0
#> [15] BiocGenerics_0.30.0 BiocStyle_2.12.0
#>
#> loaded via a namespace (and not attached):
#> [1] nlme_3.1-139 bitops_1.0-6
#> [3] bit64_0.9-7 tools_3.6.0
#> [5] irlba_2.3.3 R6_2.4.0
#> [7] DT_0.5 vipor_0.4.5
#> [9] DBI_1.0.0 lazyeval_0.2.2
#> [11] mgcv_1.8-28 colorspace_1.4-1
#> [13] withr_2.1.2 gridExtra_2.3
#> [15] tidyselect_0.2.5 bit_1.1-14
#> [17] compiler_3.6.0 BiocNeighbors_1.2.0
#> [19] shinyjs_1.0 colourpicker_1.0
#> [21] bookdown_0.9 scales_1.0.0
#> [23] stringr_1.4.0 digest_0.6.18
#> [25] rmarkdown_1.12 rentrez_1.2.2
#> [27] XVector_0.24.0 pkgconfig_2.0.2
#> [29] htmltools_0.3.6 htmlwidgets_1.3
#> [31] rlang_0.3.4 RSQLite_2.1.1
#> [33] DelayedMatrixStats_1.6.0 shiny_1.3.2
#> [35] jsonlite_1.6 dplyr_0.8.0.1
#> [37] RCurl_1.95-4.12 magrittr_1.5
#> [39] BiocSingular_1.0.0 GenomeInfoDbData_1.2.1
#> [41] Matrix_1.2-17 ggbeeswarm_0.6.0
#> [43] Rcpp_1.0.1 munsell_0.5.0
#> [45] viridis_0.5.1 stringi_1.4.3
#> [47] yaml_2.2.0 rintrojs_0.2.0
#> [49] zlibbioc_1.30.0 Rtsne_0.15
#> [51] plyr_1.8.4 grid_3.6.0
#> [53] blob_1.1.1 promises_1.0.1
#> [55] shinydashboard_0.7.1 crayon_1.3.4
#> [57] miniUI_0.1.1.1 lattice_0.20-38
#> [59] cowplot_0.9.4 splines_3.6.0
#> [61] knitr_1.22 pillar_1.3.1
#> [63] igraph_1.2.4.1 reshape2_1.4.3
#> [65] XML_3.98-1.19 glue_1.3.1
#> [67] evaluate_0.13 BiocManager_1.30.4
#> [69] httpuv_1.5.1 gtable_0.3.0
#> [71] purrr_0.3.2 assertthat_0.2.1
#> [73] xfun_0.6 rsvd_1.0.0
#> [75] mime_0.6 xtable_1.8-4
#> [77] later_0.8.0 viridisLite_0.3.0
#> [79] tibble_2.1.1 beeswarm_0.2.3
#> [81] AnnotationDbi_1.46.0 memoise_1.1.0
#> [83] shinyAce_0.3.3
# devtools::session_info()
Ganz, C. 2016. “rintrojs: A Wrapper for the Intro.js Library.” Journal of Open Source Software 1 (6). The Open Journal. http://dx.doi.org/10.21105/joss.00063.
Rue-Albrecht, K., F. Marini, C. Soneson, and A. T. L. Lun. 2018. “ISEE: Interactive Summarizedexperiment Explorer.” F1000Research 7 (June):741.
Tasic, B., V. Menon, T. N. Nguyen, T. K. Kim, T. Jarsky, Z. Yao, B. Levi, et al. 2016. “Adult mouse cortical cell taxonomy revealed by single cell transcriptomics.” Nat. Neurosci. 19 (2):335–46.
Van der Maaten, L., and G. Hinton. 2008. “Visualizing Data Using T-SNE.” J. Mach. Learn. Res. 9 (2579-2605):85.