43
How to analyze 10x Genomics Visium spatial transcriptomics data in R using Seurat
I have 10x Genomics Visium spatial transcriptomics data from mouse brain tissue. The CellRanger Space output is ready. I want to visualize gene expression on the tissue image, identify spatially variable genes, and deconvolve spot-level cell types. What is the Seurat workflow for spatial analysis?
3 views
1 Answer
36
✓
✓ Accepted Answer
Seurat has built-in support for 10x Visium spatial data. Here is the complete workflow:
```r
library(Seurat)
library(SeuratData)
library(ggplot2)
library(patchwork)
# ── 1. Load Visium data ──
# Point to the Space Ranger output directory
brain <- Load10X_Spatial(
data.dir = 'spaceranger_output/',
filename = 'filtered_feature_bc_matrix.h5',
assay = 'Spatial',
slice = 'slice1',
filter.matrix = TRUE
)
# ── 2. QC ──
brain[['percent.mt']] <- PercentageFeatureSet(brain, pattern='^mt-')
VlnPlot(brain, features='percent.mt')
brain <- subset(brain, percent.mt < 25)
# ── 3. Normalize ──
brain <- SCTransform(brain, assay='Spatial', verbose=FALSE)
# ── 4. Visualize genes on tissue ──
SpatialFeaturePlot(brain, features = c('Hpca', 'Ttr'))
# Custom overlay
SpatialFeaturePlot(brain, features='Hpca',
pt.size.factor=1.6, alpha=c(0.1,1))
# ── 5. Spatially variable genes ──
brain <- RunPCA(brain, assay='SCT', verbose=FALSE)
brain <- FindSpatiallyVariableFeatures(
brain,
assay = 'SCT',
features = VariableFeatures(brain)[1:1000],
selection.method = 'moransi' # Moran's I
)
top_svg <- head(SpatiallyVariableFeatures(brain, selection.method='moransi'), 6)
SpatialFeaturePlot(brain, features=top_svg, ncol=3)
# ── 6. Clustering ──
brain <- RunUMAP(brain, dims=1:30)
brain <- FindNeighbors(brain, dims=1:30)
brain <- FindClusters(brain, verbose=FALSE)
SpatialDimPlot(brain, label=TRUE)
# ── 7. Deconvolution with RCTD ──
library(spacexr)
# Provide a single-cell reference
reference <- Reference(sc_counts, sc_celltypes, sc_nUMI)
visium_obj <- SpatialRNA(coords, visium_counts, colSums(visium_counts))
RCTD <- create.RCTD(visium_obj, reference, max_cores=4)
RCTD <- run.RCTD(RCTD, doublet_mode='doublet')
brain[['RCTD']] <- results_to_seurat(RCTD)
```
For more advanced spatial analysis (trajectory, niche analysis), check **Squidpy** (Python/scanpy ecosystem) and **BANKSY** (spatial domain detection).