Glossary · Single-Cell and Spatial
Visium
A Visium spot isn't a cell, it's a pool of one to ten, and treating it like single-cell data is the fastest way to misread your tissue.
By Ming "Tommy" Tang, Director of Bioinformatics in Big Pharma · Reviewed September 2026 · 3 min read
Also: 10x Visium, Visium HD
Definition
Visium is a sequencing-based spatial transcriptomics platform from 10x Genomics that captures poly-adenylated mRNA directly on a barcoded glass slide, then reverse-transcribes, amplifies, and sequences it so each transcript's spatial origin is preserved. Standard Visium prints 5,000 barcoded capture spots per 6.5 × 6.5 mm area, each 55 μm in diameter and spaced 100 μm apart, so a single spot typically pools transcripts from 1 to 10 cells rather than one. Visium HD replaces the spot grid with a gapless array of 2 × 2 μm barcoded features, which Space Ranger then bins into 2 μm, 8 μm, or 16 μm analysis resolutions to trade granularity for signal density. Both versions output a gene-by-spot (or gene-by-feature) matrix alongside x,y coordinates and a registered tissue image, unlike dissociated single-cell methods, which discard tissue architecture entirely.
You'll meet Visium the moment a collaborator hands you a Space Ranger output folder and asks for "clusters on the tissue image." It looks like scRNA-seq with extra steps: a gene-by-spot matrix, a clustering pipeline, a UMAP. The part that decides whether your analysis is correct is the thing the matrix doesn't tell you, each row in standard Visium isn't a cell, it's a barcoded capture spot that pooled mRNA from whatever cells happened to sit on top of it.
That distinction changes how you normalize, how you interpret a cluster, and whether you need a deconvolution step before you say anything about cell type. Get it wrong and you'll report "this region is macrophage-high" when what you actually measured is a spot that's half macrophage, half stroma.
Why it matters
Treat a standard Visium spot as a single cell and you'll misattribute mixed signal to a specific cell type. A spot sitting at a tumor-stroma boundary can show both epithelial and fibroblast markers at once, and if you skip deconvolution and just cluster and label, you'll report a cell population that doesn't exist as a discrete entity, it's an averaged mixture. The correct move is either to run a reference-based deconvolution method (RCTD via Seurat's spacexr integration is the one with published support in the 10x ecosystem) to estimate per-spot cell-type proportions, or to move to Visium HD and bin at 8 μm or use nuclei segmentation to approach true single-cell resolution. Which one you pick depends on whether the biological question needs cell-type composition per region (deconvolution is enough) or needs to resolve individual cell states within a structure (you need HD-level resolution).
Where people get it wrong
The most common mistake is carrying scRNA-seq intuition over unchanged: assuming a Visium barcode identifies one cell the way a droplet barcode does in 10x 3' scRNA-seq. It doesn't, for standard Visium, the 55 μm spot is a fixed physical feature on the slide, not a cell boundary, so a UMAP built from spot expression is a map of local tissue neighborhoods, not of single-cell states. A second, quieter mistake is normalizing spot counts exactly like scRNA-seq counts (normalize_total to 10,000 then log1p) without registering that this step treats a spot's mixed-cell composition as technical noise, when part of that variation is real biological heterogeneity in what's sitting on the spot. Visium HD narrows but doesn't eliminate this: the default 8 μm bin is described as "near-single-cell," not single-cell, so the same caution applies at smaller scale.
A concrete example
A typical first pass on a Visium sample: load the Space Ranger output, normalize, cluster, and overlay clusters on the tissue image to check whether they map to recognizable anatomical regions before trusting any marker gene result. If a Leiden cluster forms a clean anatomical band on the H&E overlay, that's a good sign it reflects real tissue structure; if it's scattered isolated spots with no spatial coherence, suspect a spot-mixing or batch artifact before writing up the marker genes.
import scanpy as sc
adata = sc.read_visium("sample1/outs")
adata.var_names_make_unique()
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, flavor="seurat", n_top_genes=2000)
sc.pp.pca(adata)
sc.pp.neighbors(adata)
sc.tl.leiden(adata)
sc.pl.spatial(adata, color="leiden", img_key="hires")
sc.tl.rank_genes_groups(adata, "leiden", method="wilcoxon")Related terms
Questions people ask
- What is the difference between Visium and Visium HD?
Standard Visium prints 5,000 fixed 55 μm spots per 6.5×6.5 mm capture area, spaced 100 μm apart, each averaging 1, 10 cells. Visium HD replaces this with a gapless grid of 2×2 μm barcoded features, which Space Ranger bins into 2 μm, 8 μm (the default for near-single-cell cell-type mapping), or 16 μm analysis resolutions.
- How many cells are in one Visium spot?
Typically 1 to 10 cells, depending on tissue type and cell density, because a standard 55 μm spot is larger than most single cells. This is why standard Visium clusters describe local tissue neighborhoods, not individual cell states, unless you run a deconvolution method like RCTD to estimate per-spot cell-type composition.
- Can I analyze Visium data the same way as scRNA-seq?
The core workflow transfers directly: normalize, find variable genes, PCA, neighbor graph, Leiden or Louvain clustering, UMAP. What's new is the spatial coordinates and tissue image layered on top, plus the fact that a spot's expression is a mixture, which should change how you interpret clusters, not how you compute them.
- What tools do I use to analyze Visium data?
In R, Seurat's
Load10X_Spatial()reads Space Ranger output, and functions likeRunBanksy()add neighborhood context for spatial domain detection. In Python, Scanpy'ssc.read_visium()loads the AnnData object andsc.pl.spatial()overlays clusters on the H&E image; Squidpy extends this with spatial statistics.- Why does my Visium spot show intronic or unexpected reads?
Visium uses the same poly-dT capture chemistry as 10x 3' scRNA-seq, so it inherits the same internal poly-A priming behavior that pulls in intronic and pre-mRNA reads. This is expected biology and signal, not contamination, and it behaves the same way it does in single-cell data.
Related pages
- Guide · How to Detect Batch Effects in Spatial Transcriptomics
- Guide · How to Detect Integration Over-Correction in Spatial Transcriptomics
- Guide · How to Sanity-Check Marker Genes and Cell Type Labels in Spatial Transcriptomics
- Guide · How to Choose a Normalization Method in Spatial Transcriptomics
- Guide · How to Tell If You Overclustered in Spatial Transcriptomics
Related reading on the blog
Sources
- Visium Spatial Platform | 10x Genomics — Standard Visium spot spec: 55 μm diameter, 100 μm spacing, 5,000 spots per capture area, 1, 10 cells per spot
- Visium HD Spatial Gene Expression Performance | 10x Genomics — Visium HD 2×2 μm feature grid and 2/8/16 μm analysis resolutions
- Analysis, visualization, and integration of Visium HD spatial datasets with Seurat — Load10X_Spatial(), RunBanksy() for spatial domains, RCTD-based deconvolution workflow
- Analysis and visualization of spatial transcriptomics data, scanpy — sc.read_visium(), normalization, clustering, and sc.pl.spatial() overlay workflow
- Exploring Spatial Transcriptomics: A Dive into Visium Data Analysis in Python — Normalization caveat for spot mixtures and Moran's I for spatially variable genes