coordinate system of xenium explorer and stada are inconsistent
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 45/100
- Issue type
- Bug
- Clarity
- Needs clarification
- Activity status
- Active
- Tech stack
- python
- Domain
- bioinformatics, data
Research direction
Start by tracing the xenium() and xenium_aligned_image() entry points with the provided Xenium output and alignment CSV, then inspect the coordinate metadata for morphology_focus, cell_labels, cell_boundaries, and cell_circles. Document the units and required transformation, and show how to extract and visualize each sample while preserving the Xenium Explorer coordinate system.
Written by the indexing model from the issue text.
Description
Dear sir:
Hi, I’m currently a beginner working with Xenium spatial transcriptomics, and I have a question about coordinate systems in SpatialData.
I have one Xenium slide containing 8 samples. In Xenium Explorer, the coordinate system appears to be in micrometer-scale units. However, when I load the data into SpatialData using:
sdata = xenium(
path="/STtonsil/Data/output/",
cells_as_circles=True
)
sdata.images["he_image"] = xenium_aligned_image(
image_path="../slide_1/0104154_Default_Extended.ome.tif",
alignment_file="../slide_1/slide1_HE_staining_matrix.csv"
)
I obtain the following SpatialData object:
SpatialData object
├── Images
│ ├── 'he_image': DataArray[cyx] (3, 111104, 56320)
│ └── 'morphology_focus': DataTree[cyx] (4, 112141, 54121), ...
├── Labels
│ ├── 'cell_labels': DataTree[yx] ...
│ └── 'nucleus_labels': DataTree[yx] ...
├── Points
│ └── 'transcripts': DataFrame ... (3D points)
├── Shapes
│ ├── 'cell_boundaries': GeoDataFrame ...
│ ├── 'cell_circles': GeoDataFrame ...
│ └── 'nucleus_boundaries': GeoDataFrame ...
└── Tables
└── 'table': AnnData ...
All of these elements are currently associated with the global coordinate system.
When I visualize the images using:
import matplotlib.pyplot as plt
axes = plt.subplots(1, 2, figsize=(10, 10))[1].flatten()
sdata.pl.render_images("he_image").pl.show(
ax=axes[0],
title="H&E image"
)
sdata.pl.render_images("morphology_focus").pl.show(
ax=axes[1],
title="Morphology image"
)
the x-axis of the resulting plot ranges from approximately 0 to 50,000. However, in Xenium Explorer, the corresponding coordinate system appears to range only up to approximately 10,000 µm.
Therefore, the coordinates do not seem to match. For example, when I extract the coordinates of sample C1 from my AnnData object:
xy_C1 = adata_slide1[
adata_slide1.obs["sampleid"] == "C1"
].obsm["spatial"]
xmin_C1, ymin_C1 = xy_C1.min(axis=0)
xmax_C1, ymax_C1 = xy_C1.max(axis=0)
print(
xmin_C1,
ymin_C1,
xmax_C1,
ymax_C1
)
the resulting coordinates do not correspond to the coordinates I see in Xenium Explorer.
Could you please explain how I can correctly convert or transform the SpatialData global coordinates into the actual Xenium micrometer coordinate system?
More specifically, I would like to know:
What coordinate system are morphology_focus, cell_labels, cell_boundaries, and cell_circles using in this SpatialData object?
How can I convert their coordinates to the same micrometer-scale coordinate system used by Xenium Explorer?
What is the correct way to extract and visualize each of the 8 samples separately while keeping the spatial coordinates consistent with Xenium Explorer?
Is there a recommended SpatialData function or transformation for converting between the image pixel coordinates and the Xenium physical (µm) coordinates?
I would really appreciate any guidance on this, as I’m still learning how Xenium and SpatialData handle coordinate systems. Thank you very much for your help!
spatialdata figure coordinate:
- Dominant language
- Python
- Stars
- 394
- Forks
- 95
- Avg merge
- 3d 9h
- Merged PRs (30d)
- 5
Getting set up
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from scverse/spatialdata
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
scverse/spatialdata#1256 ·
Maintainers usually reply within 1 day
-
bug 🚨 element: labels 🏷️ method: aggregation 🔢 needs: triage priority: medium
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
scverse/spatialdata#1249 ·
Maintainers usually reply within 1 day
-
bug 🚨 element: images 🌌 element: labels 🏷️ needs: triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
scverse/spatialdata#1239 ·
Maintainers usually reply within 1 day
-
bug 🚨 element: shapes ▲ models needs: triage priority: medium
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
scverse/spatialdata#1234 ·
Maintainers usually reply within 1 day
-
bug 🚨 element: labels 🏷️ method: aggregation 🔢 needs: triage priority: medium
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
scverse/spatialdata#1230 ·
Maintainers usually reply within 1 day
All issues in scverse/spatialdata
Similar issues
-
correction metadata
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
acl-org/acl-anthology#10104 · 1 comment ·
Maintainers usually reply within 1 day
-
bug status/needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
prowler-cloud/prowler#12885 · 1 comment ·
Maintainers usually reply within 1 day
-
Bug in GaussianTailProbabilityCalibrator: running_statistics=False still uses a windowed varianceOpenbug good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
selimfirat/pysad#107 ·
Maintainers usually reply within 1 day
-
bug ci-failure high priority
Difficulty 1/5 Under an hour Newbie friendliness 88/100
vllm-project/vllm-omni#8194 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day