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:

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: