Skip to contents

About this workshop

iSEE (Interactive SummarizedExperiment Explorer) is a Bioconductor software package (Rue-Albrecht et al. 2018) that provides a powerful and extendable multi-purpose visual interface for exploring data stored in a SummarizedExperiment object, using the R/shiny framework.
Given the widespread adoption of SummarizedExperiment and its derivatives (SingleCellExperiment, SpatialExperiment, …) throughout the Bioconductor ecosystem and the smooth interoperability from other main frameworks (Seurat, Scanpy/AnnData), this package can be a ubiquitous companion across all the main steps of efficient analysis workflows, from the initial quality control all the way down to deploying data to accompany publications.

In this workshop, we will provide an overview of its main functionality, displaying how the most common tasks in data exploration and interpretation can be achieved within this package, which delivers an efficient combination of interactivity and reproducibility.
Attendees will be able to learn hands-on through a rich vignette that composes a masterclass-like full course on iSEE and its related packages (iSEEu, iSEEde, iSEEpathways, iSEEindex, and more). We aim to empower users in a “from zero to hero” format to explore in depth a wide spectrum of datasets, providing a free, natural, efficient, and customizable solution to achieve this within the Bioconductor project, and ultimately extract valuable insight from omics datasets in interdisciplinary settings.

Installing and loading the required packages

To run the content presented in this demo, make sure to first run this following chunk in your R session. This will install the workshop package as well as all required dependencies.

install.packages("BiocManager")
BiocManager::install("iSEE/iSEEWorkshopEuroBioc2025", 
                     dependencies = TRUE, 
                     build_vignettes = TRUE)

Let’s start!

This command will load all required dependencies and set you up for the upcoming session!

Given the very interactive and hands-on nature of this workshop, most of its execution will be guided during the live presentation.
This vignette is intended as a fille rouge through it, with constant reminders that there’s the iUSEiSEE package, which is possibly the most comprehensive collection of resources on how to use iSEE, from beginner level, all the way to its pro-like features (and extensions!).

The packages that will be used in this workshop are essentially listed below:

# the essentials
library("SingleCellExperiment")
library("iSEE")
library("TENxPBMCData")

# some extensions of the iSEE package itself
library("iSEEu")
library("iSEEhex")
library("iSEEde")
library("iSEEpathways")
library("iSEEhub")
library("iSEEindex")

Got data?

Most of the functionality covered in this workshop will be illustrated by means of a single-cell RNA sequencing dataset that is included in the package. You can load the dataset as follows:

sce <- readRDS(
  file = system.file("datasets", "sce_pbmc3k.RDS", package = "iSEEWorkshopEuroBioc2025")
)

sce
#> class: SingleCellExperiment 
#> dim: 32738 2643 
#> metadata(0):
#> assays(2): counts logcounts
#> rownames(32738): MIR1302-10 FAM138A ... AC002321.2 AC002321.1
#> rowData names(19): ENSEMBL_ID Symbol_TENx ... FDR_cluster11
#>   FDR_cluster12
#> colnames(2643): Cell1 Cell2 ... Cell2699 Cell2700
#> colData names(24): Sample Barcode ... labels_ont cell_ontology_labels
#> reducedDimNames(3): PCA TSNE UMAP
#> mainExpName: NULL
#> altExpNames(0):

This dataset has already been processed following established principles for single-cell analysis with Bioconductor. To see how the processing was done, consult the script provided with the workflow package.

Specifically, this object contains some of the “classical” relevant sample metadata in its colData slot, covering both categorical (cell type, cluster labels) and numerical (stemming from QC steps):

colData(sce)
#> DataFrame with 2643 rows and 24 columns
#>               Sample          Barcode       Sequence   Library
#>          <character>      <character>    <character> <integer>
#> Cell1         pbmc3k AAACATACAACCAC-1 AAACATACAACCAC         1
#> Cell2         pbmc3k AAACATTGAGCTAC-1 AAACATTGAGCTAC         1
#> Cell3         pbmc3k AAACATTGATCAGC-1 AAACATTGATCAGC         1
#> Cell4         pbmc3k AAACCGTGCTTCCG-1 AAACCGTGCTTCCG         1
#> Cell5         pbmc3k AAACCGTGTATGCG-1 AAACCGTGTATGCG         1
#> ...              ...              ...            ...       ...
#> Cell2696      pbmc3k TTTCGAACTCTCAT-1 TTTCGAACTCTCAT         1
#> Cell2697      pbmc3k TTTCTACTGAGGCA-1 TTTCTACTGAGGCA         1
#> Cell2698      pbmc3k TTTCTACTTCCTCG-1 TTTCTACTTCCTCG         1
#> Cell2699      pbmc3k TTTGCATGAGAGGC-1 TTTGCATGAGAGGC         1
#> Cell2700      pbmc3k TTTGCATGCCTCAC-1 TTTGCATGCCTCAC         1
#>          Cell_ranger_version Tissue_status Barcode_type   Chemistry
#>                  <character>   <character>  <character> <character>
#> Cell1                 v1.1.0            NA      GemCode Chromium_v1
#> Cell2                 v1.1.0            NA      GemCode Chromium_v1
#> Cell3                 v1.1.0            NA      GemCode Chromium_v1
#> Cell4                 v1.1.0            NA      GemCode Chromium_v1
#> Cell5                 v1.1.0            NA      GemCode Chromium_v1
#> ...                      ...           ...          ...         ...
#> Cell2696              v1.1.0            NA      GemCode Chromium_v1
#> Cell2697              v1.1.0            NA      GemCode Chromium_v1
#> Cell2698              v1.1.0            NA      GemCode Chromium_v1
#> Cell2699              v1.1.0            NA      GemCode Chromium_v1
#> Cell2700              v1.1.0            NA      GemCode Chromium_v1
#>          Sequence_platform    Individual Date_published       sum  detected
#>                <character>   <character>    <character> <numeric> <integer>
#> Cell1           NextSeq500 HealthyDonor2     2016-05-26      2421       781
#> Cell2           NextSeq500 HealthyDonor2     2016-05-26      4903      1352
#> Cell3           NextSeq500 HealthyDonor2     2016-05-26      3149      1131
#> Cell4           NextSeq500 HealthyDonor2     2016-05-26      2639       960
#> Cell5           NextSeq500 HealthyDonor2     2016-05-26       981       522
#> ...                    ...           ...            ...       ...       ...
#> Cell2696        NextSeq500 HealthyDonor2     2016-05-26      3461      1155
#> Cell2697        NextSeq500 HealthyDonor2     2016-05-26      3447      1227
#> Cell2698        NextSeq500 HealthyDonor2     2016-05-26      1684       622
#> Cell2699        NextSeq500 HealthyDonor2     2016-05-26      1024       454
#> Cell2700        NextSeq500 HealthyDonor2     2016-05-26      1985       724
#>          subsets_MT_sum subsets_MT_detected subsets_MT_percent     total
#>               <numeric>           <integer>          <numeric> <numeric>
#> Cell1                73                  10           3.015283      2421
#> Cell2               186                  10           3.793596      4903
#> Cell3                28                   8           0.889171      3149
#> Cell4                46                  10           1.743085      2639
#> Cell5                12                   5           1.223242       981
#> ...                 ...                 ...                ...       ...
#> Cell2696             73                   7           2.109217      3461
#> Cell2697             32                   8           0.928343      3447
#> Cell2698             37                   7           2.197150      1684
#> Cell2699             21                   7           2.050781      1024
#> Cell2700             16                   6           0.806045      1985
#>          log10_total sizeFactor  Cluster     labels_main            labels_fine
#>            <numeric>  <numeric> <factor>     <character>            <character>
#> Cell1        3.38399   0.849265       8     CD8+ T cells Central memory CD8 T..
#> Cell2        3.69046   1.824464       1          B cells Non-switched memory ..
#> Cell3        3.49817   1.584034       4     CD4+ T cells Follicular helper T ..
#> Cell4        3.42144   1.223430       10       Monocytes Intermediate monocytes
#> Cell5        2.99167   0.484920       3         NK cells   Natural killer cells
#> ...              ...        ...      ...             ...                    ...
#> Cell2696     3.53920   1.455151        5 Dendritic cells Myeloid dendritic ce..
#> Cell2697     3.53744   1.695007        1         B cells           Plasmablasts
#> Cell2698     3.22634   0.592496        1         B cells          Naive B cells
#> Cell2699     3.01030   0.452193        1         B cells          Naive B cells
#> Cell2700     3.29776   0.792952        8    CD4+ T cells      Naive CD4 T cells
#>           labels_ont   cell_ontology_labels
#>          <character>            <character>
#> Cell1     CL:0000913 effector memory CD8-..
#> Cell2     CL:0000970 unswitched memory B ..
#> Cell3     CL:0002038 T follicular helper ..
#> Cell4     CL:0002393  intermediate monocyte
#> Cell5     CL:0000623    natural killer cell
#> ...              ...                    ...
#> Cell2696  CL:0000782 myeloid dendritic cell
#> Cell2697  CL:0000980            plasmablast
#> Cell2698  CL:0000788           naive B cell
#> Cell2699  CL:0000788           naive B cell
#> Cell2700  CL:0000895 naive thymus-derived..

Wait, what if I have a Seurat object or I did work with Scanpy?

No problem, you are just one conversion step away from using iSEE, pinky swear.

The create_datasets.Rmd notebook has a section that covers exactly that - or you might already be familiar with zellkonverter (https://bioconductor.org/packages/zellkonverter/) and/or anndataR (https://anndatar.data-intuitive.com/).

A quick poll

  • What type of plots do you commonly generate for your (single-cell) expression data?

  • Do you commonly present a collection of plots within a group meeting/a meeting with your collaborators?

  • How many iterations do you need till you reach its final version?

Breaking things down a bit, good chances are there that you can (re)produce these plots within iSEE!

Everybody likes vanilla ice

… so you might already like vanilla iSEE!

You’ll start the iSEE app by simply typing

iSEE(sce)

Yep, that’s really just that!

All you need is a SummarizedExperiment, or anything built on top of that: SingleCellExperiment, SpatialExperiment, DeeDeeExperiment, DESeqDataset, … just to name a few.

The panel types

There are 8 essential panel types by default within iSEE:

  • The reduced dimension plot can display any reduced dimension representation that is present in the reducedDim slot of the SingleCellExperiment object.
  • The column data plot can display one or two of the provided column annotations (from the colData slot).
  • The row data plot displays one or two of the provided row annotations (from the rowData slot).
  • The complex heatmap panel displays, for any assay, the observed values for a subset of the features across the samples.
  • The feature assay plot displays the observed values for one feature across the samples. It is also possible to plot the observed values for two features, in a scatter plot.
  • The sample assay plot shows the observed values for all features, for one of the samples. It is also possible to plot the observed values for two samples, in a scatter plot.
  • The row data table displays all information provided in the rowData slot of the SummarizedExperiment object, leveraging the interactivity provided by the DT package.
  • The column data table displays all information provided in the colData slot of the SummarizedExperiment object.

These panels can communicate among each other and they are much more powerful than the individual representation they carry, as this allows you to really dig deeper into your data!

The panel options

Each of the panels available within iSEE have three dedicated sets of controls, and we will look at them in detail. We have Data parameters, Visual parameters, and Selection parameters.

Once we have seen these groups of parameters, let’s think of what you can use them for!

Data parameters

Each plot panel type has a Data parameters collapsible box. This box has different content for each panel type, but in all cases it lets the user control the data that is displayed in the plot.

Visual parameters

In contrast to the Data parameters collapsible box that lets users control what is displayed in the plot, the Visual parameters box lets users control how the information is displayed.

This collapsible box contains the controls to change the size, shape, opacity, and color of the points, to facet the plot by any available categorical annotation, to subsample points for increased speed of plot rendering, and to control how legends are displayed.

Selection parameters

The Selection parameters collapsible box provides controls to transfer selections of points (features or samples) between panels.

We demonstrate examples of point transmission in some dedicated vignettes of the iUSEiSEE workshop, d03_iSEE_quickrecipes.html

Additional controls

At the top-right corner of the iSEE application, users can find additional controls for reproducibility, configuration, and help.

Organization Organize panels
Examine panel chart
Export Download panel output
Extract R code
Display panel settings
Documentation Quick tour
Open the vignette
Additional info About this session
About iSEE

Organize panels

As mentioned above, the default behaviour of the iSEE() function is to launch an instance of the user interface that displays one panel of each of the standard types (provided the underlying data is available, e.g. for reduced dimension plots the reducedDim slot is required). However, in some cases it is desirable to have multiple panels of the same type, and/or exclude some panel types.

In order to accommodate such situations, users can add, remove, change the order of and resize all panels via the Organization menu in the top-right corner.

Clicking in the selectize box listing all current panels will present you with a drop-down menu from which you can choose additional panels to add. Similarly, panels can be removed by clicking on the icon associated with the panel name.

Each panel can be individually resized by changing the width and height. Note that the total width of a row in the interface is 12 units. When the width of a panel is greater than the space available, the panel is moved to a new row.

Linking panels and transmitting point selections

When exploring data, it is often useful to be able to select a subset of points and investigate different aspects of their characteristic features. In iSEE, this can be achieved by selecting points in one panel, and transmitting this selection to one or more other panels.

The brushing and point selection can also be programmatically preconfigured.

The button Examine panel chart display a graph that reports any active point transmission between panels in the app.

Download panel output

The Download panel output button opens a modal window listing all the current panels in the app. Checkboxes allow users to select any subset of panels to export. Finally, clicking the Download button in that modal will prompt the app to save plots to PDF files, tables to CSV files, and package the set of files in a ZIP archive that users can download and save on their computer.

Extract R code

The fact that data exploration is done interactively is no reason to forego reproducibility! To this end, iSEE lets you export the exact R code used to create each of the currently visible plots.

Importantly, the script reported by iSEE contains a short preamble needed to set up variable names that are used in individual panels, including active brushes used to transfer point selections.

Display panel settings

It can take a great amount of time to achieve a satisfactory panel configuration. To avoid the need to manually organize the panels each time the app is opened, iSEE offers the possibility to export code that can be reused later to programmatically specify how the app is initialized, as well as to inspect and export the current panel settings for future use.

Quick tour

One important aspect of visualization is the ability to share your insights with others. A powerful way of easily getting people unfamiliar with your data up to speed is to provide a walkthrough of the interface and the different types of plots that are displayed. With iSEE, this can be achieved using tours. To configure a tour, you need to create a text file with two columns; named element and intro, with the former describing the UI element to highlight in each step, and the latter providing the descriptive text that will be displayed.

Clicking the Quick tour button launches an interactive tour of the interface using the rintrojs package, highlighting specific elements of the user interface, labeled with information and instructions guiding users through panels and tasks specific to individual apps.

You can see a live example of a more complex tour in action in the deployed apps exemplified on the iSEE website, for example https://hbcc-nimh.shinyapps.io/shinyApp_JNS2023/.

When configured in an efficient manner, you can consider the tour as a live version of the legend of your figures!

Open the vignette

The user interface navigation bar also includes this button to open the introductory vignette to iSEE in your we browser.

Depending on the version of iSEE that you are using, this will adaptively lead you to a locally built vignette present on your computer, or the release or the devel version of the Bioconductor package landing page, e.g. <Bioconductor 3.22>.

Session information

This button displays the output of sessionInfo(), which is a useful piece of information to report when reporting an issue with an app.

About iSEE

This button provides information about the authors of iSEE, as well as citation information.

If you use this package, please use the following citation information:

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},
}

Ready to enjoy the vanilla ice?

… and make the most out of iSEEing your data?

Let’s think again about what you want to achieve, and we can try together to guess how this can be done within iSEE.

iSEE 101 - What can you do with it?

In this section, we list a number of actions you can perform with the help of iSEE. Feel free to try them out already! The iUSEiSEE vignettes will go into more details for many of them, but this can be an excellent starter to gain experience and get quickly familiar with iSEE.

  • Organize the iSEE panels:
    • Search for the Organize panels button.
    • Try to add and remove panels, and resize and reorder the existing ones.
    • Remember to click on Apply settings afterwards.
  • Multiple panels of the same type:
    • Show two Reduced dimension plot panels; one showing the PCA representation, one showing the t-SNE representation.
    • Link them together, so that points that are selected in one are highlighted in the other.
  • More on iSEE links and transmissions:
    • Start an instance with the default set of panels and explore the different types of plots generated by the Feature assay plot panel using the choices available for the two axes.
    • Select a set of points in one of the Feature assay plot panels, by drawing a rectangle around them.
    • Then open the Selection parameters collapsible box of another Feature assay plot panel, and select the Feature assay plot panel where you made the point selection from the dropdown menu under Receive column selection from.
    • Note how the points corresponding to the cells that you selected in the first panel are highlighted in the receiving panel.
    • You can highlight the points in different ways by changing the Selection effect.
    • iSEE can display active links transmitting point selections between panel using the “Examine panel chart” menu.
  • Color the points:
    • Open the Visual parameters collapsible box in one of the Reduced dimension plot panels, and set Color by: to Column data.
    • Color the cells by Cluster, which contains the cluster labels that were assigned to the cells in the preprocessing step.
    • Color the cells by the log10-transformed number of detected genes (log10_total).
    • Set Color by: to Feature name in one of the Reduced dimension plot panels, and select one of the genes from the dropdown menu. You can search for a gene of interest by typing in the dropdown box.
  • Highlight & zoom:
    • Set Color by: to Sample name in one of the Reduced dimension plots, and use the dropdown menu underneath to change the highlighted cell.
    • Reduce the point size and increase the transparency (i.e. reduce the value for the alpha attribute).
    • Apply a downsampling grid of 100 horizontal and vertical bins.
    • As above, select a region in the first panel and transmit the selection to the second one.
    • Double-click on the area selected in the first panel to zoom and display the same view as the second panel.
    • Double click again anywhere in the panel to zoom out.
  • Launch iSEE with pre-specified configurations:
    • Start iSEE in the default configuration.
    • Click on the export icon () in the top-right corner, and select ‘Display panel settings’.
    • Copy all the code shown in the pop-up window.
    • Close the app and paste this code in your R session.
    • This defines the ‘initial’ list. Then launch a new instance adding initial = initial to the iSEE call.
    • Note how the app starts in the same configuration as it was before closing. Of course, it is still possible to continue exploring the data interactively - we have only changed the starting configuration.
    • Start iSEE with one Column data plot and one Row data plot panel.
    • Start iSEE in an empty configuration.
  • Export code
    • Click on the export icon () in the top-right corner, and select ‘Extract the R code’.
    • Copy the preamble and the code for the first plot from the pop-up window. Close the app and paste the code in your R session.
    • Note how this recreates the first plot from the app.

iSEEu: Introducing modes and some additional panels

The iSEEu (“iSEE universe”) Bioconductor package defines additional custom panels and predefined ‘modes’ (startup configurations) that may be useful for specific applications. Here we illustrate the use of the reduced dimension mode, which will start an application with one reduced dimension panel for each reduced dimension representation in the input object.

shiny::runApp(app)

Furthermore, since iSEE version 2.0.0, users can leverage the implementation of panels as a hierarchy of S4 classes to rapidly extend the framework and develop new types of panels with virtually unlimited freedom of functionality.

For example, the Hexagonal reduced dimension plot - implemented in the iSEEhex package - demonstrates an alternative to the downsampling strategy, by summarizing data points into hexagonal bins.

library("iSEEhex")
app <- iSEE(sce, initial = list(
  ReducedDimensionPlot(PanelWidth = 6L),
  ReducedDimensionHexPlot(PanelWidth = 6L)
))
shiny::runApp(app)

Another useful mode you can use with your data, for example if using iSEE for mass cytometry data, would be the modeGating. This launches an app preconfigured with multiple chain-linked feature expression plots for interactive data exploration.

# Select top variable genes ----
plot_count <- 6
rv <- rowVars(assay(sce, "logcounts"))
top_var <- head(order(rv, decreasing=TRUE), plot_count*2)
top_var_genes <- rownames(sce)[top_var]

plot_features <- data.frame(
  x = head(top_var_genes, plot_count),
  y = tail(top_var_genes, plot_count),
  stringsAsFactors = FALSE
)

# launch the app itself ----

app <- modeGating(sce, 
                  plotAssay = "logcounts",
                  features = plot_features)
shiny::runApp(app)

iSEEu also has a set of extra panels that can come in handy in different situations. For example, iSEEu::AggregatedDotPlot implements an aggregated dot plot where each feature/group combination is represented by a dot. The color of the dot scales with the mean assay value across all samples for a given group, while the size of the dot scales with the proportion of non-zero values across samples in that group. This can be an alternative to a heatmap, and an example can be seen in the chunks below:

app <- iSEE(
  sce, 
  initial = list(
    AggregatedDotPlot(
      Assay = "logcounts",
      ColumnDataLabel = "labels_main",
      CustomRowsText = top_var_genes
    )
    
  )
)

An overview of other extension packages and the panels they provide can be found on the iSEE website: https://isee.github.io/panels.html.

iSEEfier: starting to use iSEE just became even faster!

Let’s say we are interested in visualizing the expression of a list of specific marker genes in one view, or maybe we created different initial states separately, but would like to visualize them in the same instance. As we previously learned, we can do a lot of these tasks by launching the default interface with iSEE(sce), and adding/removing panels as desired. This can involve multiple manual steps (selecting the gene of interest, color by a specific colData column, …), or the execution of multiple lines of setup code. The iSEEfier package streamlines the process of starting (or if you will, firing up) an iSEE instance with a small chunk of code, avoiding the tedious way of setting up every iSEE panel individually.

In this section, we will illustrate a simple example of how to use iSEEfier. We will use the same pbmc3k data we worked with during this workshop.

We start by loading the iSEEfier package:

library("iSEEfier")

# import data
sce <- readRDS(
  file = system.file("datasets", "sce_pbmc3k.RDS", package = "iSEEWorkshopEuroBioc2025")
)

sce
#> class: SingleCellExperiment 
#> dim: 32738 2643 
#> metadata(0):
#> assays(2): counts logcounts
#> rownames(32738): MIR1302-10 FAM138A ... AC002321.2 AC002321.1
#> rowData names(19): ENSEMBL_ID Symbol_TENx ... FDR_cluster11
#>   FDR_cluster12
#> colnames(2643): Cell1 Cell2 ... Cell2699 Cell2700
#> colData names(24): Sample Barcode ... labels_ont cell_ontology_labels
#> reducedDimNames(3): PCA TSNE UMAP
#> mainExpName: NULL
#> altExpNames(0):

For example, we can be interested in visualizing the expression of GZMB, TGFB, and CD28 genes all at once. We start by providing a couple of parameters:

# define the list of genes
feature_list_1 <- c("GZMB", "TGFB1", "CD28")
# define the cluster/cell type 
cluster_1 <- "labels_main"

Now we can pass these parameters into iSEEinit() to create a customized initial configuration:

# create an initial state with iSEEinit
initial_1 <- iSEEinit(sce,
                      features = feature_list_1,
                      clusters = cluster_1,
                      add_markdown_panel = TRUE)

We can then pass the generated initial_1 list as the initial argument in the iSEE() call:

app <- iSEE(sce, initial = initial_1)

This is how it would look like:

While we are visualizing the expression of these genes, we might want to take some notes (gene X is more expressed in a certain cell type/cluster than some others, maybe we are trying to annotate the cells ourselves if the annotation wasn’t available…).
For this, we used the argument add_markdown_panel = TRUE. It will display a MarkdownBoard panel where we can note our observations without leaving the app.

We can check the initial’s content, or how the included panels are linked between each other without running the app with view_initial_tiles() and view_initial_network():

# display a graphical representation of the initial configuration, 
# where the panels are identified by their corresponding colors
view_initial_tiles(initial = initial_1)

# display a network visualization for the panels
view_initial_network(initial_1, plot_format = "igraph")

#> IGRAPH 1ba0d1f DN-- 14 4 -- 
#> + attr: name (v/c), color (v/c)
#> + edges from 1ba0d1f (vertex names):
#> [1] ReducedDimensionPlot1->ColumnDataPlot1  
#> [2] ReducedDimensionPlot2->ColumnDataPlot1  
#> [3] ReducedDimensionPlot3->ColumnDataPlot1  
#> [4] ReducedDimensionPlot4->FeatureAssayPlot4

Another alternative for network visualization would use the interactive widget provided by visNetwork:

view_initial_network(initial_1, plot_format = "visNetwork")
#> IGRAPH 422740e DN-- 14 4 -- 
#> + attr: name (v/c), color (v/c)
#> + edges from 422740e (vertex names):
#> [1] ReducedDimensionPlot1->ColumnDataPlot1  
#> [2] ReducedDimensionPlot2->ColumnDataPlot1  
#> [3] ReducedDimensionPlot3->ColumnDataPlot1  
#> [4] ReducedDimensionPlot4->FeatureAssayPlot4

It is also possible to use iSEEfier to combine multiple initial configurations into one:

# create a second initial configuration
feature_list_2 <- c("CD74", "CD79B")
initial_2 <- iSEEinit(sce,
                      features = feature_list_2,
                      clusters = cluster_1)

# merge with the previous one
merged_config <- glue_initials(initial_1, initial_2)
#> Merging together 2 `initial` configuration objects...
#> Combining sets of 14, 10 different panels.
#> 
#> Dropping 1 of the original list of 24 (detected as duplicated entries)
#> 
#> Some names of the panels were specified by the same name, but this situation can be handled at runtime by iSEE
#> (This is just a non-critical message)
#> 
#> Returning an `initial` configuration including 23 different panels. Enjoy!
#> If you want to obtain a preview of the panels configuration, you can call `view_initial_tiles()` on the output of this function

# check out the content of merged_config
view_initial_tiles(initial = merged_config)

?iSEEfier is always your friend whenever you need further documentation on the package/a certain function and how to use it.

iSEE more than one dataset!

iSEEhub: iSEEing the ExperimentHub datasets

The iSEEhub package provides a custom landing page for an iSEE application interfacing with the Bioconductor ExperimentHub. The landing page allows users to browse the ExperimentHub, select a data set, download and cache it, and import it directly into an iSEE app.

iSEEindex: one instance of iSEE to explore them all

iSEEindex provides an interface to any collection of data sets within a single iSEE web-application.
The main functionality of this package is to define a custom landing page allowing app maintainers to list a custom collection of data sets that users can select from and directly load objects into an iSEE web application. To see how to configure such an app, we will create a small example:

library("iSEE")
library("iSEEindex")

bfc <- BiocFileCache(cache = tempdir())

dataset_fun <- function() {
  x <- yaml::read_yaml(system.file(package = "iSEEindex", "example.yaml"))
  x$datasets
}
initial_fun <- function() {
  x <- yaml::read_yaml(system.file(package = "iSEEindex", "example.yaml"))
  x$initial
}
app <- iSEEindex(bfc, dataset_fun, initial_fun)

A more elaborate example (referring to the work in (Rigby et al. 2023)) is available at https://rehwinkellab.shinyapps.io/ifnresource/. The source can be found at https://github.com/kevinrue/IFNresource.

Potential use cases can include:

  • An app to present and explore the different datasets in your next publication
  • An app to explore collection of datasets collaboratively, in consortium-like initiatives
  • An app to mirror and enhance the content of e.g. the cellxgene data portal

Good tips for some exemplary use cases

This section covers some suggestions and tips on how to use iSEE for the specific objectives mentioned in their titles.

Alle gute Dinge sind drei, so goes the adage in German. Hope the three tips for each case do help you, otherwise you can simply reach out!

“I’m still doing QC dude”

  1. Open up the panels either in the default mode, or just use iSEEu::modeEmpty() to start easy
  2. Store the configuration of the set of panels once you achieved the setup you needed
  3. There is literally no problem in opening multiple panels of the same type, especially if they display complementary information

“I’m exploring around the data and I am diving deep”

  1. It might be useful to have a look at the connections between the different panels, to keep an overview on what you are displaying, and what is linked to what
  2. You can always save each of the current plot as a png image - after all, it is a web application…
  3. You can take a snapshot of the code underlying all the outputs you are seeing at any time point, just use the magic wand!

“I have my lab meeting next week”

  1. There’s no need to be stingy on the panels you can show - well, the RAM of your machine might see this differently
  2. Choose some compelling values for the data-visual-selection parameters, and export the initial configuration so that you have it ready once the group meeting is starting, and you don’t have to blame the app for crashing
  3. Consider saving all the output components you generated with the “Download panel output” button

“I am done with one dataset and I want to publish it”

  1. Come up with the best configuration of panels that tells the story right
  2. Put together a compelling tour to tell that story, highlighting different components of what people will see in the app once published
  3. Choose a nice title and have it set for the app and the tab it will be displayed into

“I even have a collection of data, is there something we can do there?”

  1. Collect the individual datasets as individual objects and place them possibly in the same location
  2. Have a look in detail at the iSEEindex way of accessing the resources - the iSEEindexRunrResource might give you just the perfect level of flexibility to read in the data any way you want within R
  3. Write up a nice yaml entry about each dataset and each initial configurations, including a tour for each

“I am just interested in looking at markers and want to make it in the most efficient manner”

  1. Start easy (empty) and keep adding, store the initial configuration, rinse & repeat
  2. If you are skilled, you can easily script away the initial list by specifying only the essential non-default arguments
  3. Use iSEEfier’s functionality for that - iSEEinit() and iSEEmarker()can save you a lot of time, and you can easily glue together the different init pieces!

“I want to generate and explore the results of pseudobulk DE analysis on single cell data. Helpz?”

  1. Use a framework such as muscat to do this properly!
  2. Take the output of the pbDS() function and wrangle it a bit to enter its content into an object of the DeeDeeExperiment class, which is able to elegantly store and organize your DEA (and FEA) results!
  3. Launch iSEE on that very DeeDeeExperiment object - your data will be in, unaltered, and all the relevant information will be placed inside this, so that you can easily access the DE results within iSEE
Here’s a compact way of how you can do that!

Courtesy to Najla Abassi ;)

## create res, a list to hold pseudobulk DE results for all contrasts
for (i in names(contrast)) {
  cat("Contrast: ", i,"\n")
  res <- pbDS(pb,
              design = mm,
              contrast = contrast[[i]],
              verbose = TRUE,
              BPPARAM = BiocParallel::MulticoreParam(6))
  
  results_list[[i]] <- res
}

## Extract one of the contrasts, for demonstration purposes
contrast_vtp_DMSO <- res$table$VTP-DMSO

## Renaming columns cleverly
for (cell in names(contrast_vtp_DMSO)) {
  contrast_vtp_DMSO[[cell]] <-
  contrast_vtp_DMSO[[cell]] |>
  dplyr::rename(log2FoldChange = logFC,
                pvalue = p_val,
                padj = p_adj.loc)
  
  rownames(contrast_vtp_DMSO[[cell]]) <- contrast_vtp_DMSO[[cell]]$gene
}

## Optional: update de + enrich list names
new_names <- c(
  "NK1 A+B" = "NK1_A_B",
  "NK1 C" = "NK1_C",
  "NK2" = "NK2",
  "NK3" = "NK3" ,
  "NKint" = "NKint"
)
names(contrast_vtp_DMSO) <- new_names[names(contrast_vtp_DMSO)]
names(func_res) <- new_names[names(func_res)]

## Create the dde object
dde <- DeeDeeExperiment(sce_NKcells, # sce object
                        de_results = contrast_vtp_DMSO, # DEA results
                        enrich_results = func_res # FEA results
                        )

## Launch iSEE!
iSEE(dde)

“I feel almighty and I want to develop a new panel type for iSEE! Where can I start?”

  1. Go bold! But first have a glance at the iSEE book (https://isee.github.io/iSEE-book/) to make sure you have a good understanding of how iSEE’s panels work
  2. Check out one of the existing custom panels that are available (e.g. within iSEEu, but not limited to that)
  3. Sometimes it is even easier to “re-purpose” the existing panels for your objective. For example, got spatial data? The column data panel can simply be used to display the x and y coordinates of the data at hand!

An example? See the beautiful iSEEtree extension realized by Giulio Benedetti (Benedetti et al. 2024), which enables you to explore in depth your microbiome data! This is now also on Bioconductor, see iSEEtree for more.

A quick rundown on iSEE’s main parameters

… and some tips on how and when to make the most out of these, especially if you have never checked them out:

  • initial: Can import any specification of the initial panel setup. Be that empty, written programmatically, or simply exported from a running instance of the app. It can look like it is a mouthful of code, but it is guaranteed to work!

  • colormap: Your best friend if you want to control how colours are handled within iSEE. You can choose custom colormaps to apply to individual assays, colData and rowData covariates. It might take a bit to get it tailored to your dataset, but it is totally worth the effort!

  • landingPage: A powerful means to change the way of how iSEE starts and is ready to present the datasets to you.

  • tour: Possibly the best way to tell an impactful story with your datasets. Surely an excellent way of auto-generating some embedded, live documentation that allows users to display the information while they proceed hands-on- This is based on the rintrojs package

  • appTitle and tabTitle: These two control the title to be displayed in the app and in the browser tab - useful if you are deploying your own data and you want to control these aspects as well!

  • voice: Yep, you can control iSEE with your voice. Nope, it is not as flexible as asking Alexa/Echo… See the dedicated vignette within the iSEE package for this!

  • bugs: The only way so far to have bugs within iSEE :)

“I saw them use iSEE”

You’re right! There’s quite a list of apps published that directly make good use of iSEE and its functionality!

Do you want to be the next one?

Take some inspiration from…

We want more!

… and we got you covered!

The iUSEiSEE repo is probably the most comprehensive set of information about iSEE and all its capabilities, and will be kept up to data as new features will come out (e.g. new extensions or panel types).

Session info

Session info
sessionInfo()
#> R version 4.5.1 (2025-06-13)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.2 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
#>  [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       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] iSEEfier_1.5.0                 iSEEindex_1.7.0               
#>  [3] iSEEhub_1.11.0                 ExperimentHub_2.99.5          
#>  [5] AnnotationHub_3.99.6           BiocFileCache_2.99.6          
#>  [7] dbplyr_2.5.1                   iSEEpathways_1.7.0            
#>  [9] iSEEde_1.7.0                   iSEEu_1.21.0                  
#> [11] iSEEhex_1.11.0                 TENxPBMCData_1.27.0           
#> [13] HDF5Array_1.37.0               h5mread_1.1.1                 
#> [15] rhdf5_2.53.4                   DelayedArray_0.35.3           
#> [17] SparseArray_1.9.1              S4Arrays_1.9.1                
#> [19] abind_1.4-8                    Matrix_1.7-4                  
#> [21] iSEEWorkshopEuroBioc2025_1.0.0 iSEE_2.21.1                   
#> [23] SingleCellExperiment_1.31.1    SummarizedExperiment_1.39.2   
#> [25] Biobase_2.69.1                 GenomicRanges_1.61.4          
#> [27] Seqinfo_0.99.2                 IRanges_2.43.1                
#> [29] S4Vectors_0.47.1               BiocGenerics_0.55.1           
#> [31] generics_0.1.4                 MatrixGenerics_1.21.0         
#> [33] matrixStats_1.5.0              BiocStyle_2.37.1              
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.5.1            later_1.4.4              urltools_1.7.3.1        
#>   [4] filelock_1.0.3           tibble_3.3.0             triebeard_0.4.1         
#>   [7] lifecycle_1.0.4          httr2_1.2.1              edgeR_4.7.4             
#>  [10] doParallel_1.0.17        lattice_0.22-7           magrittr_2.0.4          
#>  [13] limma_3.65.4             sass_0.4.10              rmarkdown_2.29          
#>  [16] jquerylib_0.1.4          yaml_2.3.10              httpuv_1.6.16           
#>  [19] DBI_1.2.3                RColorBrewer_1.1-3       purrr_1.1.0             
#>  [22] rappdirs_0.3.3           circlize_0.4.16          ggrepel_0.9.6           
#>  [25] irlba_2.3.5.1            pkgdown_2.1.3            codetools_0.2-20        
#>  [28] DT_0.34.0                scuttle_1.19.0           tidyselect_1.2.1        
#>  [31] shape_1.4.6.1            farver_2.1.2             ScaledMatrix_1.17.0     
#>  [34] viridis_0.6.5            shinyWidgets_0.9.0       jsonlite_2.0.0          
#>  [37] GetoptLong_1.0.5         BiocNeighbors_2.3.1      scater_1.37.0           
#>  [40] iterators_1.0.14         systemfonts_1.2.3        foreach_1.5.2           
#>  [43] tools_4.5.1              ragg_1.5.0               Rcpp_1.1.0              
#>  [46] glue_1.8.0               BiocBaseUtils_1.11.2     gridExtra_2.3           
#>  [49] xfun_0.53                mgcv_1.9-3               DESeq2_1.49.4           
#>  [52] dplyr_1.1.4              withr_3.0.2              shinydashboard_0.7.3    
#>  [55] BiocManager_1.30.26      fastmap_1.2.0            rhdf5filters_1.21.0     
#>  [58] shinyjs_2.1.0            digest_0.6.37            rsvd_1.0.5              
#>  [61] R6_2.6.1                 mime_0.13                textshaping_1.0.3       
#>  [64] colorspace_2.1-1         listviewer_4.0.0         RSQLite_2.4.3           
#>  [67] paws.storage_0.9.0       hexbin_1.28.5            httr_1.4.7              
#>  [70] htmlwidgets_1.6.4        pkgconfig_2.0.3          gtable_0.3.6            
#>  [73] blob_1.2.4               ComplexHeatmap_2.25.2    S7_0.2.0                
#>  [76] XVector_0.49.1           htmltools_0.5.8.1        rintrojs_0.3.4          
#>  [79] clue_0.3-66              scales_1.4.0             png_0.1-8               
#>  [82] knitr_1.50               rjson_0.2.23             visNetwork_2.1.4        
#>  [85] nlme_3.1-168             curl_7.0.0               shinyAce_0.4.4          
#>  [88] cachem_1.1.0             GlobalOptions_0.1.2      stringr_1.5.2           
#>  [91] BiocVersion_3.22.0       parallel_4.5.1           miniUI_0.1.2            
#>  [94] vipor_0.4.7              AnnotationDbi_1.71.1     desc_1.4.3              
#>  [97] pillar_1.11.0            grid_4.5.1               vctrs_0.6.5             
#> [100] promises_1.3.3           BiocSingular_1.25.0      beachmat_2.25.5         
#> [103] xtable_1.8-4             cluster_2.1.8.1          beeswarm_0.4.0          
#> [106] evaluate_1.0.5           cli_3.6.5                locfit_1.5-9.12         
#> [109] compiler_4.5.1           rlang_1.1.6              crayon_1.5.3            
#> [112] paws.common_0.8.5        fs_1.6.6                 ggbeeswarm_0.7.2        
#> [115] stringi_1.8.7            viridisLite_0.4.2        BiocParallel_1.43.4     
#> [118] Biostrings_2.77.2        colourpicker_1.3.0       sparseMatrixStats_1.21.0
#> [121] bit64_4.6.0-1            ggplot2_4.0.0            Rhdf5lib_1.31.0         
#> [124] KEGGREST_1.49.1          statmod_1.5.0            shiny_1.11.1            
#> [127] fontawesome_0.5.3        igraph_2.1.4             memoise_2.0.1           
#> [130] bslib_0.9.0              bit_4.6.0

References

Benedetti, Giulio, Ely Seraidarian, Theotime Pralas, Akewak Jeba, Tuomas Borman, and Leo Lahti. 2024. “iSEEtree: Interactive Explorer for Hierarchical Data.” Edited by Shanfeng Zhu. Bioinformatics Advances 5 (1). https://doi.org/10.1093/bioadv/vbaf107.
Eski, Sema Elif, Jiarui Mi, Macarena Pozo-Morales, Gabriel Garnik Hovhannisyan, Camille Perazzolo, Rita Manco, Imane Ez-Zammoury, et al. 2025. “Cholangiocytes Contribute to Hepatocyte Regeneration After Partial Liver Injury During Growth Spurt in Zebrafish.” Nat. Commun. 16 (1): 5260.
John, Nora, Thomas Fleming, Julia Kolb, Olga Lyraki, Sebastian Vasquez-Sepulveda, Asha Parmar, Kyoohyun Kim, et al. 2025. “Biphasic Inflammation Control by Dedifferentiated Fibroblasts Enables Axon Regeneration After Spinal Cord Injury in Zebrafish.” bioRxiv.
Rigby, Rachel, Kevin Rue-Albrecht, David Sims, and Jan Rehwinkel. 2023. Single-cell analysis of signalling responses to type I interferons.” bioRxiv, 1–68.
Rue-Albrecht, Kevin, Federico Marini, Charlotte Soneson, and Aaron T L Lun. 2018. iSEE: Interactive SummarizedExperiment Explorer.” F1000Res. 7: 741.