Starting from Version 1.2.0, escheR
package supports additional two data structures as input, including SpatialExperiment
and data.frame
from base
R. In addition, escheR
supports in-situ visualization of image-based spatially resolved data, which will be the focus of future development.
SingleCellExperiment
SpatialExperiment
inherits SingleCellExperiment
Following the same syntax, one can also visualize dimensionality reduced embeddings of a SpatialExperiment
object by providing the argument dimred
with a non-null value. Hence, the first 2 columns of the corresponding reducedDim(spe)
assay will be used as the x-y coordinate of the plot, replacing spatialCoords(spe)
.
library(escheR)
library(STexampleData)
library(scater)
library(scran)
spe <- Visium_humanDLPFC() |>
logNormCounts()
spe <- spe[, spe$in_tissue == 1]
spe <- spe[, !is.na(spe$ground_truth)]
top.gene <- getTopHVGs(spe, n=500)
set.seed(100) # See below.
spe <- runPCA(spe, subset_row = top.gene)
make_escheR(
spe,
dimred = "PCA"
) |>
add_fill(var = "ground_truth") +
theme_minimal()
spe$counts_MOBP <- counts(spe)[which(rowData(spe)$gene_name=="MOBP"),]
spe$ground_truth <- factor(spe$ground_truth)
# Point Binning version
make_escheR(
spe,
dimred = "PCA"
) |>
add_ground_bin(
var = "ground_truth"
) |>
add_fill_bin(
var = "counts_MOBP"
) +
# Customize aesthetics
scale_fill_gradient(low = "white", high = "black", name = "MOBP Count")+
scale_color_discrete(name = "Spatial Domains") +
theme_minimal()
Note 1: The strategy of binning to avoid overplotting is previously proposed in
schex
. While we provide an implementation inescheR
, we would caution our users that the binning strategy could lead to intermixing of cluster memberships. In our implementation, the majority membership of the data points belonging to a bin is selected as the label of the bin. Users should use the binning strategy under their own discretion, and interpret the visualization carefully.
Note 2:
add_fill_bin()
shoudl be applied afteradd_ground_bin()
for the better visualization outcome.
SpatialExperiment
ObjectTo demonstrate the principle that escheR
can be used to visualize image-based spatially-resolved data pending optimization, we include two image-based spatially resolved transcriptomics data generated via seqFish platform and Slide-seq V2 platform respectively. The two datasets have been previously curated in the STexampleData
package
library(STexampleData)
library(escheR)
spe_seqFISH <- seqFISH_mouseEmbryo()
make_escheR(spe_seqFISH) |>
add_fill(var = "embryo")
NOTE: trimming down the
colData(spe)
before piping into make-escheR could reduce the computation time to make the plots, specifically whencolData(spe)
contains extremely large number of irrelavent features/columns.
We aim to provide accessibility to all users regardless of their programming background and preferred single-cell analysis pipelines. Nevertheless , with limited resource, our sustaining efforts will prioritize towards the maintenance of the established functionality and the optimization for image-based spatially resolved data. We regret we are not be able to provide seamless interface to other R pipelines such as Seurat
and Giotto
in foreseeable future.
Instead, we provide a generic function that works with a data.frame
object as input. For example, relevant features in Suerat
can be easily exported as a data.frame
object manually or via tidyseurat
[https://github.com/stemangiola/tidyseurat]. The exported data frame can be pipe into escheR
.
library(escheR)
library(Seurat)
pbmc_small <- SeuratObject::pbmc_small
pbmc_2pc <- pbmc_small@reductions$pca@cell.embeddings[,1:2]
pbmc_meta <- pbmc_small@meta.data
#> Call generic function for make_escheR.data.frame
make_escheR(
object = pbmc_meta,
.x = pbmc_2pc[,1],
.y = pbmc_2pc[,2]) |>
add_fill(var = "groups")
utils::sessionInfo()
#> R version 4.5.0 (2025-04-11 ucrt)
#> Platform: x86_64-w64-mingw32/x64
#> Running under: Windows Server 2022 x64 (build 20348)
#>
#> Matrix products: default
#> LAPACK version 3.12.1
#>
#> locale:
#> [1] LC_COLLATE=C
#> [2] LC_CTYPE=English_United States.utf8
#> [3] LC_MONETARY=English_United States.utf8
#> [4] LC_NUMERIC=C
#> [5] LC_TIME=English_United States.utf8
#>
#> time zone: America/New_York
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats4 stats graphics grDevices utils datasets methods
#> [8] base
#>
#> other attached packages:
#> [1] scran_1.37.0 scater_1.37.0
#> [3] scuttle_1.19.0 ggpubr_0.6.0
#> [5] STexampleData_1.17.0 SpatialExperiment_1.19.1
#> [7] SingleCellExperiment_1.31.0 SummarizedExperiment_1.39.0
#> [9] Biobase_2.69.0 GenomicRanges_1.61.0
#> [11] GenomeInfoDb_1.45.4 IRanges_2.43.0
#> [13] S4Vectors_0.47.0 MatrixGenerics_1.21.0
#> [15] matrixStats_1.5.0 ExperimentHub_2.99.5
#> [17] AnnotationHub_3.99.5 BiocFileCache_2.99.5
#> [19] dbplyr_2.5.0 BiocGenerics_0.55.0
#> [21] generics_0.1.4 escheR_1.9.0
#> [23] ggplot2_3.5.2 BiocStyle_2.37.0
#>
#> loaded via a namespace (and not attached):
#> [1] DBI_1.2.3 gridExtra_2.3 httr2_1.1.2
#> [4] rlang_1.1.6 magrittr_2.0.3 compiler_4.5.0
#> [7] RSQLite_2.4.0 png_0.1-8 vctrs_0.6.5
#> [10] pkgconfig_2.0.3 crayon_1.5.3 fastmap_1.2.0
#> [13] backports_1.5.0 magick_2.8.6 XVector_0.49.0
#> [16] labeling_0.4.3 rmarkdown_2.29 ggbeeswarm_0.7.2
#> [19] UCSC.utils_1.5.0 tinytex_0.57 purrr_1.0.4
#> [22] bit_4.6.0 bluster_1.19.0 xfun_0.52
#> [25] beachmat_2.25.1 cachem_1.1.0 jsonlite_2.0.0
#> [28] blob_1.2.4 DelayedArray_0.35.1 BiocParallel_1.43.3
#> [31] cluster_2.1.8.1 irlba_2.3.5.1 broom_1.0.8
#> [34] parallel_4.5.0 R6_2.6.1 bslib_0.9.0
#> [37] RColorBrewer_1.1-3 limma_3.65.1 car_3.1-3
#> [40] jquerylib_0.1.4 Rcpp_1.0.14 bookdown_0.43
#> [43] knitr_1.50 igraph_2.1.4 Matrix_1.7-3
#> [46] tidyselect_1.2.1 viridis_0.6.5 dichromat_2.0-0.1
#> [49] abind_1.4-8 yaml_2.3.10 codetools_0.2-20
#> [52] curl_6.2.3 lattice_0.22-7 tibble_3.2.1
#> [55] BumpyMatrix_1.17.0 withr_3.0.2 KEGGREST_1.49.0
#> [58] evaluate_1.0.3 Biostrings_2.77.1 pillar_1.10.2
#> [61] BiocManager_1.30.25 filelock_1.0.3 carData_3.0-5
#> [64] BiocVersion_3.22.0 scales_1.4.0 glue_1.8.0
#> [67] metapod_1.17.0 tools_4.5.0 hexbin_1.28.5
#> [70] BiocNeighbors_2.3.1 ScaledMatrix_1.17.0 locfit_1.5-9.12
#> [73] ggsignif_0.6.4 cowplot_1.1.3 grid_4.5.0
#> [76] tidyr_1.3.1 edgeR_4.7.2 AnnotationDbi_1.71.0
#> [79] beeswarm_0.4.0 BiocSingular_1.25.0 vipor_0.4.7
#> [82] rsvd_1.0.5 Formula_1.2-5 cli_3.6.5
#> [85] rappdirs_0.3.3 S4Arrays_1.9.1 viridisLite_0.4.2
#> [88] dplyr_1.1.4 gtable_0.3.6 rstatix_0.7.2
#> [91] sass_0.4.10 digest_0.6.37 dqrng_0.4.1
#> [94] ggrepel_0.9.6 SparseArray_1.9.0 rjson_0.2.23
#> [97] farver_2.1.2 memoise_2.0.1 htmltools_0.5.8.1
#> [100] lifecycle_1.0.4 httr_1.4.7 statmod_1.5.0
#> [103] bit64_4.6.0-1