Monday, September 7, 2026

Visium HD: What Changes When Resolution Goes Subcellular

Spatial transcriptomics · Visium HD · Xenium · CosMx · platform comparison

Why Resolution Matters (and Why It Is Not Everything)

Visium HD delivers 2 µm bins — roughly single-cell resolution — while the original Visium captures 55 µm spots that each contain 5–20 cells. That 27x improvement in resolution sounds decisive. In practice, the right platform depends on your biological question, not just the spec sheet.

This post covers what Visium HD actually changes analytically, where it outperforms its predecessor, and when Xenium or CosMx is the better choice despite having a fixed gene panel.

Figure 1. Left: spatial resolution comparison — Visium HD achieves 2 µm bins vs. 55 µm spots for Visium v1. Right: capability trade-offs across platforms normalized to maximum observed values.

What Visium HD Changes: The Bin Model

Visium HD does not capture individual cells — it captures 2 µm square bins that tile the tissue continuously. The key workflow difference is binning strategy: you choose a bin size at analysis time, not at capture time.

import squidpy as sq
import scanpy as sc

# Load Visium HD at 8 µm bins (good starting point — balances resolution and sparsity)
adata = sq.read.visium(
    path="visium_hd_output/",
    counts_file="filtered_feature_bc_matrix.h5",
    library_id="your_sample_id",
    bin_size=8,  # options: 2, 8, 16 micrometers
)

print(adata)
# AnnData: n_obs (bins) depends heavily on bin_size
# bin_size=2:  ~500,000 bins (very sparse, ~2-5 UMI/bin)
# bin_size=8:  ~30,000 bins (workable, ~50-100 UMI/bin)
# bin_size=16: ~8,000 bins (Visium-like density)

Start with 8 µm bins for exploratory analysis. At 2 µm, most bins will have fewer than 5 UMI — too sparse for reliable clustering without heavy smoothing. Only use 2 µm bins if you need subcellular resolution for a specific question (e.g., resolving nuclear vs. cytoplasmic transcript localization).

The Critical Difference: Deconvolution Is Optional

With Visium v1, cell2location or RCTD is mandatory to get cell type proportions per spot. With Visium HD at 8 µm bins, many bins will contain a single dominant cell type and can be annotated directly by marker expression — though mixed bins still exist at tissue interfaces.

# Standard clustering works directly on HD bins
sc.pp.filter_cells(adata, min_counts=10)
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=3000)
sc.tl.pca(adata)
sc.pp.neighbors(adata, n_neighbors=15)
sc.tl.leiden(adata, resolution=0.4)

# Annotate by marker expression (same workflow as scRNA-seq)
sc.pl.dotplot(adata, markers_dict, groupby="leiden")

# Optional: if you want single-cell precision at 2µm bins,
# still use cell2location with matched scRNA-seq reference

Visium HD vs. Xenium: Choosing the Right Tool

Choose Visium HD when:

  • You need whole-transcriptome coverage (not a fixed panel)
  • Your question involves discovery — finding unexpected cell states or pathways
  • You have FFPE tissue (Visium HD supports FFPE; Xenium also does)
  • You want spatial multi-omics (Visium HD + CUT&TAG or protein co-detection)

Choose Xenium/CosMx when:

  • You need subcellular resolution (mRNA localization within a cell)
  • Your target genes are already known and a panel of 100–500 genes is sufficient
  • You need higher sensitivity per transcript (in-situ amplification vs. sequencing)
  • Your tissue is thick or 3D (Xenium handles z-stacking)

Squidpy Compatibility

Visium HD AnnData loads exactly like Visium v1 from Squidpy's perspective. All tools covered in this series work without modification:

# Everything from earlier posts works identically on Visium HD
sq.gr.spatial_neighbors(adata, coord_type="generic", n_neighs=6)
sq.gr.nhood_enrichment(adata, cluster_key="leiden")
sq.gr.ligrec(adata, n_perms=500, cluster_key="leiden")
sq.gr.spatial_autocorr(adata, mode="moran")

# The only practical difference: more bins = longer runtime
# nhood_enrichment on 30,000 bins takes ~10 min vs ~2 min for Visium v1

One Practical Warning: Tissue Coverage

Visium HD captures a 6.5 mm × 6.5 mm area — identical to Visium v1. This is enough for most tissue sections but smaller than a typical whole-slide image. If your question requires comparing multiple tumor regions across a large section, you will need multiple capture areas or switch to a platform with larger footprint (some CosMx runs cover full slides).

Interested in what the immune cell types you are mapping at single-cell resolution are actually doing in the tumor? NeoantigenLab covers T cell exhaustion, checkpoint inhibitor mechanisms, and CAR-T biology at the molecular level.

Get the complete pack

SpatiaBio Squidpy Pack 1 — 16 Notebooks ($19)

All 16 notebooks — neighborhood enrichment, co-occurrence, ligand-receptor, spatial autocorrelation, publication figures, and the complete workflow. Includes memory tips for Visium HD. Ready to run on your own data.

Get it for $19 →

From the NeoantigenLab sister blog

Working with tumor transcriptomics for neoantigen research?

NeoantigenLab covers neoantigen biology, WES pipelines, pVACseq, and HLA typing for experimental researchers — the biology behind what you're sequencing.

Visit NeoantigenLab →

No comments:

Post a Comment

Squidpy's Delaunay Radius Pruning Builds a Graph You Can't Save — Here's the Workaround

Squidpy · spatial_neighbors_delaunay · h5ad · IORegistryError · still in latest release Squidpy's Delaunay Radius Pruning Builds a G...