Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b51099e

Browse files
berombautimtreis
andauthoredMay 17, 2024
Fix channel str support (#221)
* add channel str and multiscale tests * fix channel str * fix channel str for multiscale * add snapshots for channel str tests * merged & updated CHANGELOG * added images from runner * parametrised test * added images from runner * updated failing image from runner --------- Co-authored-by: Tim Treis <tim.treis@stud.uni-heidelberg.de>
1 parent ac062d8 commit b51099e

22 files changed

+59
-29
lines changed
 

‎.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ __pycache__/
1919
/.pytest_cache/
2020
/.cache/
2121
/data/
22+
*failed-diff.png
2223

2324
# docs
2425
/docs/generated/

‎CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,19 @@ and this project adheres to [Semantic Versioning][].
88
[keep a changelog]: https://keepachangelog.com/en/1.0.0/
99
[semantic versioning]: https://semver.org/spec/v2.0.0.html
1010

11+
## [0.2.3] - tbd
12+
13+
### Fixed
14+
15+
- Fix color assignment for NaN values (#257)
16+
- Fix channel str support #221
17+
1118
## [0.2.2] - 2024-05-02
1219

1320
### Fixed
1421

1522
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
23+
- Fix channel str support (#221)
1624

1725
## [0.2.1] - 2024-03-26
1826

‎src/spatialdata_plot/pl/render.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ def _render_images(
442442

443443
# 1) Image has only 1 channel
444444
if n_channels == 1 and not isinstance(render_params.cmap_params, list):
445-
layer = img.sel(c=channels).squeeze()
445+
layer = img.sel(c=channels[0]).squeeze()
446446

447447
if render_params.quantiles_for_norm != (None, None):
448448
layer = _normalize(

‎src/spatialdata_plot/pl/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,7 @@ def _multiscale_to_spatial_image(
13071307
data_var_keys = list(multiscale_image[optimal_scale].data_vars)
13081308
image = multiscale_image[optimal_scale][data_var_keys[0]]
13091309

1310-
return Labels2DModel.parse(image) if is_label else Image2DModel.parse(image)
1310+
return Labels2DModel.parse(image) if is_label else Image2DModel.parse(image, c_coords=image.coords["c"].values)
13111311

13121312

13131313
def _get_elements_to_be_rendered(
Loading
Loading
Loading
Loading
Loading
Loading
Loading
1.27 KB
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

‎tests/conftest.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ def sdata_blobs() -> SpatialData:
5555
return blobs()
5656

5757

58+
@pytest.fixture()
59+
def sdata_blobs_str() -> SpatialData:
60+
return blobs(n_channels=5, c_coords=["c1", "c2", "c3", "c4", "c5"])
61+
62+
5863
@pytest.fixture()
5964
def sdata_raccoon() -> SpatialData:
6065
return raccoon()

‎tests/pl/test_render_images.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,30 @@ def test_plot_can_pass_cmap_list(self, sdata_blobs: SpatialData):
4444
def test_plot_can_render_a_single_channel_from_image(self, sdata_blobs: SpatialData):
4545
sdata_blobs.pl.render_images(elements="blobs_image", channel=0).pl.show()
4646

47+
def test_plot_can_render_a_single_channel_from_multiscale_image(self, sdata_blobs: SpatialData):
48+
sdata_blobs.pl.render_images(elements="blobs_multiscale_image", channel=0).pl.show()
49+
50+
def test_plot_can_render_a_single_channel_from_image_no_el(self, sdata_blobs: SpatialData):
51+
sdata_blobs.pl.render_images(channel=0).pl.show()
52+
53+
def test_plot_can_render_a_single_channel_str_from_image(self, sdata_blobs_str: SpatialData):
54+
sdata_blobs_str.pl.render_images(elements="blobs_image", channel="c1").pl.show()
55+
56+
def test_plot_can_render_a_single_channel_str_from_multiscale_image(self, sdata_blobs_str: SpatialData):
57+
sdata_blobs_str.pl.render_images(elements="blobs_multiscale_image", channel="c1").pl.show()
58+
4759
def test_plot_can_render_two_channels_from_image(self, sdata_blobs: SpatialData):
4860
sdata_blobs.pl.render_images(elements="blobs_image", channel=[0, 1]).pl.show()
4961

62+
def test_plot_can_render_two_channels_from_multiscale_image(self, sdata_blobs: SpatialData):
63+
sdata_blobs.pl.render_images(elements="blobs_multiscale_image", channel=[0, 1]).pl.show()
64+
65+
def test_plot_can_render_two_channels_str_from_image(self, sdata_blobs_str: SpatialData):
66+
sdata_blobs_str.pl.render_images(elements="blobs_image", channel=["c1", "c2"]).pl.show()
67+
68+
def test_plot_can_render_two_channels_str_from_multiscale_image(self, sdata_blobs_str: SpatialData):
69+
sdata_blobs_str.pl.render_images(elements="blobs_multiscale_image", channel=["c1", "c2"]).pl.show()
70+
5071
def test_plot_can_pass_color_to_single_channel(self, sdata_blobs: SpatialData):
5172
sdata_blobs.pl.render_images(elements="blobs_image", channel=1, palette="red").pl.show()
5273

‎tests/pl/test_render_labels.py

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import matplotlib
33
import numpy as np
44
import pandas as pd
5+
import pytest
56
import scanpy as sc
67
import spatialdata_plot # noqa: F401
78
from anndata import AnnData
@@ -100,39 +101,33 @@ def test_can_plot_with_one_element_color_table(self, sdata_blobs: SpatialData):
100101
color=["channel_0_sum", "channel_1_sum"], table_name=["table", "multi_table"]
101102
).pl.show()
102103

103-
def test_plot_label_categorical_color(self, sdata_blobs: SpatialData):
104-
n_obs = max(_get_unique_label_values_as_index(sdata_blobs["blobs_labels"]))
104+
@pytest.mark.parametrize(
105+
"label",
106+
[
107+
"blobs_labels",
108+
"blobs_multiscale_labels",
109+
],
110+
)
111+
def test_plot_label_categorical_color(self, sdata_blobs: SpatialData, label: str):
112+
self._make_tablemodel_with_categorical_labels(sdata_blobs, label)
113+
114+
def _make_tablemodel_with_categorical_labels(self, sdata_blobs, label):
115+
n_obs = max(_get_unique_label_values_as_index(sdata_blobs[label]))
105116
adata = AnnData(
106-
RNG.normal(size=(n_obs, 10)), obs=pd.DataFrame(RNG.normal(size=(n_obs, 3)), columns=["a", "b", "c"])
117+
RNG.normal(size=(n_obs, 10)),
118+
obs=pd.DataFrame(RNG.normal(size=(n_obs, 3)), columns=["a", "b", "c"]),
107119
)
108120
adata.obs["instance_id"] = np.arange(adata.n_obs)
109121
adata.obs["category"] = RNG.choice(["a", "b", "c"], size=adata.n_obs)
122+
adata.obs["category"][:3] = ["a", "b", "c"]
110123
adata.obs["instance_id"] = list(range(adata.n_obs))
111-
adata.obs["region"] = "blobs_labels"
112-
table = TableModel.parse(adata=adata, region_key="region", instance_key="instance_id", region="blobs_labels")
113-
sdata_blobs["other_table"] = table
114-
115-
# with pytest.raises(ValueError, match="could not convert string"):
116-
# sdata_blobs.pl.render_labels('blobs_labels', color='category').pl.show()
117-
sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category")
118-
sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show()
119-
120-
def test_plot_multiscale_label_categorical_color(self, sdata_blobs: SpatialData):
121-
# recreate RNG to get same plot acorss 3.9 and 3.10 workers
122-
RNG = np.random.default_rng(seed=42)
123-
124-
n_obs = max(_get_unique_label_values_as_index(sdata_blobs["blobs_multiscale_labels"]))
125-
adata = AnnData(
126-
RNG.normal(size=(n_obs, 10)), obs=pd.DataFrame(RNG.normal(size=(n_obs, 3)), columns=["a", "b", "c"])
127-
)
128-
adata.obs["instance_id"] = np.arange(adata.n_obs)
129-
adata.obs["category"] = RNG.choice(["a", "b", "c"], size=adata.n_obs)
130-
adata.obs["instance_id"] = list(range(adata.n_obs))
131-
adata.obs["region"] = "blobs_multiscale_labels"
124+
adata.obs["region"] = label
132125
table = TableModel.parse(
133-
adata=adata, region_key="region", instance_key="instance_id", region="blobs_multiscale_labels"
126+
adata=adata,
127+
region_key="region",
128+
instance_key="instance_id",
129+
region=label,
134130
)
135131
sdata_blobs["other_table"] = table
136-
137132
sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category")
138-
sdata_blobs.pl.render_labels("blobs_multiscale_labels", color="category").pl.show()
133+
sdata_blobs.pl.render_labels(label, color="category").pl.show()

0 commit comments

Comments
 (0)
Failed to load comments.