milume
A thinking surface for spatial omics.
Layer images, cells, and transcripts in one reactive notebook widget.
You have a spatial dataset and a hunch. milume turns a notebook cell into a tactile,
reactive surface where you can look at your tissue, select what catches your eye, and
carry that selection straight into code. Cells, landmarks and measurements stay in
plain AnnData / obs_names / geometry, so what you see on the surface is what you
analyze next.
One call opens it:
import milume
w = milume.peek(adata, color="cell_type")
Draw selections and landmarks, color by category or gene, expand neighborhoods, and read everything back in Python. The name comes from mille (thousand, as in mille-feuille, layers) + lume (light).
Contents
Install
pip install milume
With uv:
uv add milume
Contributors: see AGENTS.md for dev setup.
Migrate from spatial-rx
Note: Milume was formerly spatial-rx. The API is unchanged; only the names moved:
pip uninstall spatial-rx
pip install milume
import milume # was: import spatial_rx
Alongside other viewers
Milume complements other viewers. Use milume to form intuition: layer images, cells,
and transcripts in a notebook, select what stands out, and carry the selection straight
into your analysis code. Use heavier viewers when you need to inspect in depth.
Landmarks and selections round-trip as plain geometry and obs_names, so you can hand
the same regions to any viewer.
API
milume.peek(data, **kwargs) opens the surface on your data and returns a widget w
you read results from. Full widget guide and generated API reference:
docs site.
import milume
w = milume.peek(adata, color="cell_type") # AnnData with obsm["spatial"]
w = milume.peek(sdata, color="cell_type") # SpatialData on disk: adds the 3D cube
| Argument | Meaning |
|---|---|
data |
AnnData with obsm["spatial"], or a SpatialData |
color |
obs column to color cells by |
genes |
gene(s) to expose for coloring; limits the catalog on large matrices |
spatial_key |
obsm key holding coordinates (default "spatial") |
table, image, labels |
override what is inferred from a SpatialData |
contrast_limits |
display range for the 3D image (default: its 1st to 99.5th percentile, from the coarsest pyramid level) |
milume.peek works on AnnData and on-disk SpatialData (including Pyxa-backed
mosaics). For Xenium, Atera, CosMx, and other readers, see
Other platforms below and the
LandmarksWidget guide on the docs site.
Other platforms
Read with spatialdata-io as usual. Xenium and Atera work with defaults (obsm["spatial"] is the cell position in global coordinates). CosMx puts FOV-local pixels in obsm["spatial"]; use global coordinates instead:
import spatialdata_io as sio
import milume
w = milume.peek(sio.cosmx(path), spatial_key="global")
- From a SpatialData, the widget finds the table, the labels element it annotates, a 3D image on the same grid, and their µm frame (override with
table=,image=,labels=;contrast_limits=for the image). - Press I (Inspect): the top toolbar turns into a dashed Inspect pill, hovering shows a live coarse preview of the tissue under the cursor, and a click places a 300 µm window; on release a full-resolution cube of it takes over the plot area, cells drawn as outlines colored like the map, with your landmarks on top. Shift+drag in the cube (or the Move tool) slides the window across the tissue; a plain drag orbits. The bottom bar holds the camera, Adjust (image and label display) and Cross-section (cuts). Esc closes the cube; Esc again, or ×, leaves Inspect. The side panels' peek tabs stay over the cube, so you can focus a category or Selection to color it.
- Save window on the Inspect pill adds the window as an inspect selection, listed in the Selections panel with a thumbnail and named by its main category and size (e.g.
Epithelial · 214); hover a row for its cell count and category mix, click it to reopen the window. Read the inspected cells back withw.get_obs_names(adata, "<inspect id>")orw.selections. - Hold Space to pan in any tool.
Read results back in Python:
| Need | Call |
|---|---|
| Cells in a selection | w.get_obs_names(adata, selection_id), w.assign_obs_mask(adata, key, selection_id) |
| Landmarks as geometry | landmarks_to_geodataframe(w.landmarks) |
| Measure against landmarks | distances, composition, along_positions (+ write_obs) |
| Compare a subset with the tissue | enrichment(adata, obs_names, obs_key=...) |
| XY vs 3D neighbors | nearest_distances(adata, seeds, obs_key=...) (needs obsm["spatial"] x, y, z) |
| Map colors for other plots | w.category_colors("cell_type") |
| Inspect window and cube cut | w.inspect_cx, w.inspect_cy, w.inspect_size_um; w.volume_cut = x0, x1, y0, y1, z0, z1 µm (intersect X/Y with the window for the shown box) |
Large expression matrices are sent sparse; pass genes= to limit the gene
catalog.
Metadata
Release files for milume 1.3.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| milume-1.3.3.tar.gz | 31.6 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| milume-1.3.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.1 MB
Release files / milume-1.3.3.tar.gz
| Download URL | milume-1.3.3.tar.gz |
|---|---|
| Size | 31.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2ee55a437eed8e561f57fa0730b3fb544a891c029668ad3572dbf3498d83d643
|
|
BLAKE2b-256 checksum How to use checksums |
8927b2f2c4fdf08c3ffe85b84b5a47daf9eab62b74c16b84ab8f9c425f6c2a1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / milume-1.3.3-py3-none-any.whl
| Download URL | milume-1.3.3-py3-none-any.whl |
|---|---|
| Size | 1.4 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
daf828a3f04d49a82e268cb11c5bf3dce5c29acb68e4d0e3a286c738e300664f
|
|
BLAKE2b-256 checksum How to use checksums |
b7ae9caa491c16f7d487a04275807a28cc5608bb6e9d15fa19674ed04f280186
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|