Skip to main content

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).

Open in molab

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 LandmarksWidget on Stellaromics colon A2 with clustered cells and drawn landmarks

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 with w.get_obs_names(adata, "<inspect id>") or w.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.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for milume 1.3.5
File Size Uploaded
milume-1.3.5.tar.gz 23.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for milume 1.3.5
File Interpreter ABI Platform
milume-1.3.5-py3-none-any.whl Python 3 none any Details

Total release size: 24.6 MB

Release files / milume-1.3.5.tar.gz

Download URL milume-1.3.5.tar.gz
Size 23.1 MB
Tags Source
SHA-256 checksum
How to use checksums
6ccf52a9ad112299c505b9820f02ecd20c83b780e2abbbbd285d1f05f489d2d1
BLAKE2b-256 checksum
How to use checksums
25a84532849c0811346ca742e5db793372825c4e481881a15ff242ab5d61417c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","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.5-py3-none-any.whl

Download URL milume-1.3.5-py3-none-any.whl
Size 1.4 MB
Tags Python 3
SHA-256 checksum
How to use checksums
7a16ba128eae791221cdb1c840eb410aad75b8a23fe06b0eda96cc37b855e536
BLAKE2b-256 checksum
How to use checksums
7c5b6ea8d9ffebd650220e51ba54697df6192ecb597a177d4fc8fcee0a880dab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","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 history Release notifications | RSS feed

This release

1.3.5 This release

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page