diff --git a/vignettes/img/iSEEhex_binned.png b/vignettes/img/iSEEhex_binned.png
new file mode 100644
index 0000000..df03fb2
Binary files /dev/null and b/vignettes/img/iSEEhex_binned.png differ
diff --git a/vignettes/workshop_isee_extension.Rmd b/vignettes/workshop_isee_extension.Rmd
index 7f2078d..75f271f 100644
--- a/vignettes/workshop_isee_extension.Rmd
+++ b/vignettes/workshop_isee_extension.Rmd
@@ -8,7 +8,6 @@ vignette: >
%\VignetteEncoding{UTF-8}
---
-
```{r, include = FALSE}
## Track time spent on making the vignette
startTime <- Sys.time()
@@ -50,8 +49,7 @@ Relevant background reading:
[materials](https://isee.github.io/iSEEWorkshop2019/),
[slides](https://isee.github.io/iSEEWorkshop2019Slides/)
* Rue-Albrecht K, Marini F, Soneson C and Lun ATL.
- iSEE: Interactive SummarizedExperiment Explorer
- [version 1; peer review: 3 approved]. F1000Research 2018, 7:741
+ iSEE: Interactive SummarizedExperiment Explorer [version 1; peer review: 3 approved]. F1000Research 2018, 7:741
(https://doi.org/10.12688/f1000research.14966.1)
* Vignette: [SummarizedExperiment for Coordinating Experimental Assays, Samples, and Regions of Interest](https://bioconductor.org/packages/release/bioc/vignettes/SummarizedExperiment/inst/doc/SummarizedExperiment.html#anatomy-of-a-summarizedexperiment)
@@ -331,8 +329,8 @@ For instance, the same initial state illustrated above can be achieved using the
```{r}
initial <- list(
- ReducedDimensionPlot(),
- FeatureAssayPlot()
+ ReducedDimensionPlot(),
+ FeatureAssayPlot()
)
```
@@ -479,9 +477,9 @@ Due to the use of `uniquifyFeatureNames()` above, the function must first map to
```{r}
map_GO <- function(pathway_id, se) {
- pathway_ensembl <- mapIds(org.Hs.eg.db, pathway_id, "ENSEMBL", keytype = "GOALL", multiVals = "CharacterList")[[pathway_id]]
- pathway_rownames <- rownames(se)[rowData(se)[["gene_id"]] %in% pathway_ensembl]
- pathway_rownames
+ pathway_ensembl <- mapIds(org.Hs.eg.db, pathway_id, "ENSEMBL", keytype = "GOALL", multiVals = "CharacterList")[[pathway_id]]
+ pathway_rownames <- rownames(se)[rowData(se)[["gene_id"]] %in% pathway_ensembl]
+ pathway_rownames
}
airway <- registerAppOptions(airway, Pathways.map.functions = list(GO = map_GO))
```
@@ -541,7 +539,14 @@ In this demo, let us create a new class called `ReducedDimensionHexPlot`, that i
The objective is to produce a panel that displays the same information as the original `ReducedDimensionPlot()` panel, but summarising data points into hexagonal bins.
-For this, the new class needs an additional slot to store the number of hexagonal bins to create (i.e., a resolution for the plot).
+One major motivation for this functionality is that arbitrarily large data sets comprising many data points may be summarised into a modest number of hexagonal bins, providing a boost in speed when rendering the plot.
+
+However, this is not without caveats:
+
+* Summarising can take many forms (e.g., counting, averaging).
+* The ideal number of bins may be different for different data sets.
+
+To proceed, the new class needs at least one additional slot to store the number of hexagonal bins to create (i.e., a resolution for the plot).
```{r}
setClass("ReducedDimensionHexPlot", contains="ReducedDimensionPlot", slots=c(BinResolution = "numeric"))
@@ -554,11 +559,11 @@ We set the default resolution to 100 hexagonal bins along each axis.
```{r}
setMethod("initialize", "ReducedDimensionHexPlot", function(.Object, ...) {
- args <- list(...)
-
- args <- .emptyDefault(args, "BinResolution", 100)
-
- do.call(callNextMethod, c(list(.Object), args))
+ args <- list(...)
+
+ args <- .emptyDefault(args, "BinResolution", 20)
+
+ do.call(callNextMethod, c(list(.Object), args))
})
```
@@ -572,7 +577,7 @@ This is standard practice in `r BiocStyle::Biocpkg("iSEE")`, where the arguments
```{r}
ReducedDimensionHexPlot <- function(...) {
- new("ReducedDimensionHexPlot", ...)
+ new("ReducedDimensionHexPlot", ...)
}
```
@@ -591,7 +596,7 @@ iSEE(sce, initial = list(
How can we even tell which is which?!
-### Overwriting S4 methods
+### Changing the public panel name
The generic `.fullName()` declares the label shown in the interface, at the top of each panel.
@@ -614,6 +619,8 @@ iSEE(sce, initial = list(
+### Changing the background panel colour
+
Similarly, the generic `.panelColor()` declares the background colour of the panel header (as well as the colour of brushes for compatible panels).
Let us create a method for the new class, that gives it a different colour.
@@ -635,6 +642,8 @@ iSEE(sce, initial = list(
+### Altering the user interface
+
At this point, there is still no component in the user interface to control the resolution value store in the new slot.
A number of S4 methods control the interface elements displayed in the variousgroups of parameters located under each panel.
@@ -646,12 +655,12 @@ Thus, the generic `.defineVisualSizeInterface()` is the natural choice to use fo
```{r}
setMethod(".defineVisualSizeInterface", "ReducedDimensionHexPlot", function(x) {
- plot_name <- .getEncodedName(x)
-
- tagList(
- .numericInput.iSEE(x, "BinResolution", label="Bin resolution:",
- min=1, value=x[["BinResolution"]], step = 1)
- )
+ plot_name <- .getEncodedName(x)
+
+ tagList(
+ .numericInput.iSEE(x, "BinResolution", label="Bin resolution:",
+ min=1, value=x[["BinResolution"]], step = 1)
+ )
})
```
@@ -666,6 +675,39 @@ iSEE(sce, initial = list(
+### Altering the panel output
+
+Time for the most exciting and challenging task: making the panel produce a different type of plot!
+
+To this end, the generic `.generateDotPlot()` is key.
+Given a panel state, axis labels, and an environment that contains the `SummarizedExperiment()` object and possibly other relevant values such as incoming selections,
+
+```{r}
+setMethod(".generateDotPlot", "ReducedDimensionHexPlot", function(x, labels, envir) {
+ plot_cmds <- list()
+ plot_cmds[["ggplot"]] <- "ggplot() +"
+ color_lab <- "Count"
+ new_aes <- .buildAes()
+ plot_cmds[["hex"]] <- sprintf(
+ "ggplot2::geom_hex(%s, bins = %i, plot.data) +",
+ new_aes,
+ as.integer(x[["BinResolution"]])
+ )
+ plot_cmds[["theme_base"]] <- "theme_bw()"
+
+ list(plot=.textEval(plot_cmds, envir), commands=plot_cmds)
+})
+```
+
+```{r, message=FALSE, warning=FALSE, eval=FALSE}
+iSEE(sce, initial = list(
+ ReducedDimensionHexPlot(PanelWidth = 6L, VisualBoxOpen = TRUE, VisualChoices = "Size"),
+ ReducedDimensionPlot(PanelWidth = 6L, VisualBoxOpen = TRUE, VisualChoices = "Size")
+))
+```
+
+![Screenshot of iSEE app including a parent ReducedDimensionPlot and a ReducedDimensionHexPlot extension after replacing the internal plotting code in the child panel.](img/iSEEhex_binned.png)
+
## Session info
```{r}