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 asked 2 months ago by Admin
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).
answered 4 weeks ago by Admin