No project description provided
Project description
histomap
Napari dock widget to overlay tile polygons and table annotations from SpatialData onto an H&E image, and to interactively select cells in a 2D embedding (e.g., UMAP in AnnData.obsm) and visualize the selected regions on the H&E.
- Overlay mode: color polygons on the H&E by an
AnnData.obscolumn (categorical or numeric) fromSpatialData.tables[<name>]. - UMAP-lasso mode: open a 2D embedding from
AnnData.obsm(e.g.,X_umap), lasso points, and preview the corresponding tile polygons on the H&E; optionally save the selection back toobs.
Installation
# Recommended: use a fresh environment
conda create --name histomap python=3.11 -y
conda activate histomap
# If published on PyPI:
pip install histomap
# If installing from source in this repo:
# pip install -e .
Runtime dependencies (installed automatically if from PyPI)
- napari, PyQt5, magicgui
- geopandas, shapely
- anndata, matplotlib, spatialdata
- (Optional, for robust SVS reading)
openslide-python,napari-openslide
Windows notes
- If
geopandas/shapelywheels fail, upgrade pip (pip install -U pip) and try again.- For OpenSlide, install the prebuilt binaries or use
conda install -c conda-forge openslide openslide-pythonin the same environment.
Quick start
import histomap as hm
Method 1 — Use a SpatialData object
import spatialdata as sd
import histomap as hm
sda = sd.read_zarr("/path/to/spatialdata.zarr")
# Preferred: pass the H&E path explicitly (best on Windows)
viewer = hm.histomap(
sda,
wsi_path="/path/to/HE_image.svs", # alias: imagePath="/path/to/HE_image.svs"
# mpp=0.263049, # µm/px (optional; if tiles are in microns, scale=1/mpp is auto-applied)
)
# If you omit wsi_path, histomap will try to parse a path from str(sda).
# If no path is found, you’ll see a dialog asking you to pass wsi_path explicitly.
Typical workflow in the UI
- Click Open WSI in Viewer (if not already opened).
- Choose a Table (from
sda.tables), Data axis (obsorobsm), and a column/key. -
- For
obs: click Render Overlay to color polygons on the H&E. - For
obsm(e.g.,X_umap): click Open UMAP + Lasso, lasso points, and inspect the green Lasso preview on the H&E.
- For
- Optionally enter a Layer name and obs column, then click Save selection to write labels into
AnnData.obsand add a persistent overlay layer.
Method 2 — Use with lazyslide/wsidata
import lazyslide as zs
from wsidata import open_wsi
import histomap as hm
wsi = open_wsi("/path/to/HE_image.svs")
# Assuming tiling & feature extraction are already done, e.g.:
# zs.pp.tile_tissues(wsi, tile_px=256, mpp=0.5)
# zs.tl.feature_extraction(wsi, model='chief')
# Launch viewer and overlay tiles/annotations stored in wsi.tables / wsi.shapes
viewer = hm.histomap(wsi)
Parameters (entry point)
viewer = hm.histomap(
sda_or_wsi, # SpatialData or compatible WSIData
*,
wsi_path=None, # str | Path | None; preferred image to open (alias: imagePath)
mpp=None, # float | None; µm/px. If provided and no explicit scale, applies scale=(1/mpp, 1/mpp)
global_to_pixel_scale=None, # (sx, sy) override for polygon transform
global_to_pixel_translate=None, # (tx, ty) override
theme="dark",
canvas_bg="white",
)
Precedence
- If
global_to_pixel_scaleis provided, it overridesmpp. - If
wsi_pathis provided, it overrides any path parsed fromSpatialData. - If neither
wsi_pathnor a parsable path exists, histomap shows a dialog explaining how to passwsi_path.
Data assumptions
sda.shapes["tiles"]is aGeoDataFramewith polygons; its index contains tile IDs.sda.tables[<name>]is anAnnDatawhereobs_namesmatch the tile IDs (string-matched; dtype mismatches are handled).- For UMAP-lasso,
AnnData.obsm[<key>]contains an(n_cells, 2+)embedding (e.g.,X_umap).
Tips & alignment
- Tiles already in pixels? Don’t pass
mpp. Use Calibrate (fit tiles) if needed. - Tiles in microns? Pass
mpp=<µm/px>and click Auto-align (use MPP) (or rely on the automatic scale if you didn’t override withglobal_to_pixel_scale). - The overlay layers inherit the image layer’s affine, so they remain aligned across pyramid levels.
Saving lasso selections (what gets written)
When you click Save selection:
- The chosen
obscolumn is created/normalized as plain Python strings (dtype=object) with no missing values. - Only selected rows receive the provided label (string). Non-selected rows remain unchanged (empty string by default).
- A persistent overlay layer is added with the saved selection (the transient Lasso preview is removed).
Why object strings?
Writing pandas’ nullable string dtype (dtype="string") to Zarr requires opting in (anndata.settings.allow_write_nullable_strings=True). Using plain object strings avoids that requirement and is maximally portable.
Troubleshooting
❗️“boolean value of NA is ambiguous” during wsi.write() / SpatialData.write()
You likely have pd.NA or mixed types in AnnData.obs. Ensure no NA in string-like columns and that they are object strings.
❗️“allow_write_nullable_strings is False”
Either set:
import anndata as ad
ad.settings.allow_write_nullable_strings = True
or convert to object strings.
❗️Cannot overwrite/move files on Windows after closing the viewer
Clear layers before saving: viewer.layers.clear() and run garbage collection.
❗️No H&E appears and you see “H&E Image Missing”
Pass the image explicitly:
viewer = hm.histomap(sda, wsi_path="/absolute/path/to/HnE.svs")
FAQ
Q: Do I need openslide?
A: Only if you’re opening .svs/WSI formats through Napari.
Q: Can I use a custom image and MPP without modifying the dock UI?
A: Yes—pass wsi_path=... and mpp=... to hm.histomap(...).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file histomap-0.1.1.tar.gz.
File metadata
- Download URL: histomap-0.1.1.tar.gz
- Upload date:
- Size: 15.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.4 CPython/3.11.13 Windows/10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c12db90fe855030728d37eafcb1520ac500f2655661066b7ff3f2ad88e49c20
|
|
| MD5 |
24bcf9c851a9b8cd8ae29d056d7c5828
|
|
| BLAKE2b-256 |
0394b309e72ab592992818e19fb46b499b80819935aa30c756a272ba28ae2dde
|
File details
Details for the file histomap-0.1.1-py3-none-any.whl.
File metadata
- Download URL: histomap-0.1.1-py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.4 CPython/3.11.13 Windows/10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cda371c0ef3faa9bf135d22501a212f1b67a2dc5bcf674864cd1d708d64b18f
|
|
| MD5 |
6049d12855aaac4fb50887fa8bb33e80
|
|
| BLAKE2b-256 |
6c49ba29fe92b4983005a5b46328841fc99dca6ffb977ce2f5a3239d7be423c6
|