My goal: Which cell states inferred in 10x Visium co-occur in the same regions, and are those co-occurrences supported by real cell-cell neighborhoods in 10x Xenium?
This is a toy project designed to help me work with mostly with Xenium, but alsso Visium and scFFPE-seq datasets together and explore ways to integrate them. You can find my code in the notebooks folder.
I explore a single FFPE tissue of breast cancer block (Stage II-B, ER + /PR − /HER2 +) analyzed with a trio of complementary technologies scFFPE-seq, Visium and Xenium by Janesick et al Nat. Commun. 2023. As far as I know, its the first round of such analysis being done at that time. Datasets were obtained from the GEO repository under id GSE243280 and Xenium FFPE Human Breast with Custom Add-on Panel
Overview of the platforms:
- scFFPE-seq technology designed to perform high-throughput single-nucleus RNA sequencing on archival, formalin-fixed paraffin-embedded (FFPE) tissue samples from 10x Genomics. It is well suited for building a reference atlas from archived FFPE samples.
- Readout: next-generation sequencing
- Coverage: targeted fixed RNA panel
- Resolution: single-cell
- Output matrix: cell × gene
- Visium is a sequencing-based spatial transcriptomics technology from 10x Genomics. It is well suited for capturing global tissue architecture and
gives whole-transcriptome spatial context but at spot level (mixed cells per spot).
- Readout: next-generation sequencing
- Coverage: whole transcriptome
- Resolution: ~55 µm spots (typically containing 2-10 cells)
- Output matrix: spot × gene
- Xenium is an imaging-based spatial transcriptomics platform from 10x Genomics. It is well suited for high-resolution, cell-level spatial analysis and gives single-cell spatial positions but usually a targeted panel (fewer genes).
- Readout: microscopy imaging
- Coverage: targeted gene panel (typically 100-5000 genes)
- Resolution: single-cell to subcellular
- Output matrix: cell × gene
How to combine them? A practical strategy is to use scFFPE-seq as the reference atlas (to to learn what cell types/states look like molecularly), use that reference to deconvolve mixed Visium spots into likely cell-type proportions and then use Xenium to validate whether those inferred co-occurrences are truly adjacent at single-cell resolution.
In practice:
- Build a high-quality annotated scFFPE-seq reference.
- Deconvolve Visium spots using the reference (for example, with cell2location).
- Test whether co-occurring Visium cell states are supported by true Xenium neighborhoods.
Some useful links:
- intro to models and methods for spatial transcriptomics by Ben Raphael (CGSI 2023) https://www.youtube.com/watch?v=CRuSrd8JWI0
- https://spatialdata.scverse.org - I find it a bit better in teh context of spatial transcirptomics to the sc-best-practices tutorial (https://www.sc-best-practices.org/spatial/introduction.html)
Core single-cell & spatial analysis:
🧬 scanpy • anndata • squidpy
Probabilistic modeling & deconvolution:
🧬 scvi-tools • cell2location
Spatial data infrastructure:
🧬 spatialdata • spatialdata-io
General analysis & plotting:
🧬 pandas • numpy • matplotlib
visium-xenium-reference-mapping/
├── env/
├── data/
│ ├── reference/
│ ├── visium/
│ └── xenium/
├── notebooks/
│ ├── 01_reference_qc_annotation.ipynb
│ ├── 02_visium_qc_exploration.ipynb
│ ├── 03_visium_cell2location.ipynb
│ ├── 04_xenium_loading_qc.ipynb
│ ├── 05_xenium_annotation_neighborhoods.ipynb
│ └── 06_cross_platform_validation.ipynb
└── src/
My steps:
- Get the reference into a solid annotated AnnData.
- Run Visium + cell2location.
- Load Xenium and transfer the same labels and markers.
- Run cross-platform validation in Notebook 06:
- matched cell types between Visium and Xenium
- abundance/fraction concordance plots
- pairwise Visium A-B co-occurrence vs Xenium A-B neighborhood z comparison
Results are reasonable, but the cross-platform concordance is quite moderate. This is my first-pass integration and validation analysis on this dataset. Additional QC (at the cell/spot level), more careful label transfer/lifting across platforms, and tighter harmonization of cell-state definitions could improve agreement in future iterations.
Figure. Pairwise comparison of Visium A-B co-occurrence and Xenium A-B neighborhood enrichment (z-score).
