▸ Chatomics Field GuideWhat They Don't Teach You →

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.

python
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 like RunBanksy() add neighborhood context for spatial domain detection. In Python, Scanpy's sc.read_visium() loads the AnnData object and sc.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

Related reading on the blog

Sources

  1. 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
  2. Visium HD Spatial Gene Expression Performance | 10x Genomics — Visium HD 2×2 μm feature grid and 2/8/16 μm analysis resolutions
  3. Analysis, visualization, and integration of Visium HD spatial datasets with Seurat — Load10X_Spatial(), RunBanksy() for spatial domains, RCTD-based deconvolution workflow
  4. Analysis and visualization of spatial transcriptomics data, scanpy — sc.read_visium(), normalization, clustering, and sc.pl.spatial() overlay workflow
  5. Exploring Spatial Transcriptomics: A Dive into Visium Data Analysis in Python — Normalization caveat for spot mixtures and Moran's I for spatially variable genes