Skip to content

Commit 0e7360c

Browse files
Merge pull request #192 from scverse/bugfix/issue191-cannot-stack-multiple-render-commands-of-the-same-kind
Allow for stacking of render commands
2 parents c63efb5 + 91f810d commit 0e7360c

11 files changed

+54
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning][].
1515
- Multiscale image handling: user can specify a scale, else the best scale is selected automatically given the figure size and dpi (#164)
1616
- Large images are automatically rasterized to speed up performance (#164)
1717
- Added better error message for mismatch in cs and ax number (#185)
18+
- Can now stack render commands (#190, #192)
1819

1920
### Fixed
2021

src/spatialdata_plot/pl/basic.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ def show(
567567
]
568568

569569
# prepare rendering params
570-
render_cmds = OrderedDict()
570+
render_cmds = []
571571
for cmd, params in plotting_tree.items():
572572
# strip prefix from cmd and verify it's valid
573573
cmd = "_".join(cmd.split("_")[1:])
@@ -577,9 +577,9 @@ def show(
577577

578578
if "render" in cmd:
579579
# verify that rendering commands have been called before
580-
render_cmds[cmd] = params
580+
render_cmds.append((cmd, params))
581581

582-
if len(render_cmds.keys()) == 0:
582+
if len(render_cmds) == 0:
583583
raise TypeError("Please specify what to plot using the 'render_*' functions before calling 'imshow()'.")
584584

585585
if title is not None:
@@ -609,7 +609,7 @@ def show(
609609
# Check if user specified only certain elements to be plotted
610610
cs_contents = _get_cs_contents(sdata)
611611
elements_to_be_rendered = []
612-
for cmd, params in render_cmds.items():
612+
for cmd, params in render_cmds:
613613
if cmd == "render_images" and cs_contents.query(f"cs == '{cs}'")["has_images"][0]: # noqa: SIM114
614614
if params.elements is not None:
615615
elements_to_be_rendered += (
@@ -632,13 +632,14 @@ def show(
632632
)
633633

634634
# filter out cs without relevant elements
635+
cmds = [cmd for cmd, _ in render_cmds]
635636
coordinate_systems = _get_valid_cs(
636637
sdata=sdata,
637638
coordinate_systems=coordinate_systems,
638-
render_images="render_images" in render_cmds,
639-
render_labels="render_labels" in render_cmds,
640-
render_points="render_points" in render_cmds,
641-
render_shapes="render_shapes" in render_cmds,
639+
render_images="render_images" in cmds,
640+
render_labels="render_labels" in cmds,
641+
render_points="render_points" in cmds,
642+
render_shapes="render_shapes" in cmds,
642643
elements=elements_to_be_rendered,
643644
)
644645

@@ -689,7 +690,7 @@ def show(
689690
wants_shapes = False
690691
wanted_elements = []
691692

692-
for cmd, params in render_cmds.items():
693+
for cmd, params in render_cmds:
693694
if cmd == "render_images" and has_images:
694695
wants_images = True
695696
wanted_images = params.elements if params.elements is not None else list(sdata.images.keys())

src/spatialdata_plot/pl/render.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,10 +406,13 @@ def _render_images(
406406
else:
407407
cmap = _get_linear_colormap([render_params.palette], "k")[0]
408408

409+
# Overwrite alpha in cmap: https://stackoverflow.com/a/10127675
410+
cmap._init()
411+
cmap._lut[:, -1] = render_params.alpha
412+
409413
im = ax.imshow(
410-
layer, # get rid of the channel dimension
414+
layer,
411415
cmap=cmap,
412-
alpha=render_params.alpha,
413416
)
414417
im.set_transform(trans_data)
415418

@@ -514,6 +517,12 @@ def _render_labels(
514517
) -> None:
515518
elements = render_params.elements
516519

520+
if not isinstance(render_params.outline, bool):
521+
raise TypeError("Parameter 'outline' must be a boolean.")
522+
523+
if not isinstance(render_params.contour_px, int):
524+
raise TypeError("Parameter 'contour_px' must be an integer.")
525+
517526
if render_params.groups is not None:
518527
if isinstance(render_params.groups, str):
519528
render_params.groups = [render_params.groups]
18.5 KB
Loading
20.1 KB
Loading
14.9 KB
Loading
8.51 KB
Loading

tests/pl/test_render_images.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,10 @@ def test_plot_can_stop_rasterization_with_scale_full(self, sdata_blobs: SpatialD
7777
sdata_blobs["blobs_giant_image"] = img
7878

7979
sdata_blobs.pl.render_images("blobs_giant_image", scale="full").pl.show()
80+
81+
def test_plot_can_stack_render_images(self, sdata_blobs: SpatialData):
82+
(
83+
sdata_blobs.pl.render_images(elements="blobs_image", channel=0, palette="red", alpha=0.5)
84+
.pl.render_images(elements="blobs_image", channel=1, palette="blue", alpha=0.5)
85+
.pl.show()
86+
)

tests/pl/test_render_labels.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,14 @@ def test_plot_can_stop_rasterization_with_scale_full(self, sdata_blobs: SpatialD
5959
sdata_blobs.table.uns["spatialdata_attrs"]["region"] = "blobs_giant_labels"
6060

6161
sdata_blobs.pl.render_labels("blobs_giant_labels", scale="full").pl.show()
62+
63+
def test_plot_can_stack_render_labels(self, sdata_blobs: SpatialData):
64+
(
65+
sdata_blobs.pl.render_labels(
66+
elements="blobs_labels", na_color="red", fill_alpha=1, outline_alpha=0, outline=False
67+
)
68+
.pl.render_labels(
69+
elements="blobs_labels", na_color="blue", fill_alpha=0, outline_alpha=1, outline=True, contour_px=10
70+
)
71+
.pl.show()
72+
)

tests/pl/test_render_points.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,10 @@ def test_plot_coloring_with_palette(self, sdata_blobs: SpatialData):
3030

3131
def test_plot_coloring_with_cmap(self, sdata_blobs: SpatialData):
3232
sdata_blobs.pl.render_points(color="genes", cmap="rainbow").pl.show()
33+
34+
def test_plot_can_stack_render_points(self, sdata_blobs: SpatialData):
35+
(
36+
sdata_blobs.pl.render_points(elements="blobs_points", na_color="red", size=30)
37+
.pl.render_points(elements="blobs_points", na_color="blue", size=10)
38+
.pl.show()
39+
)

tests/pl/test_render_shapes.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,10 @@ def test_plot_can_color_two_queried_shapes_elements_by_annotation(self, sdata_bl
254254
del sdata_cropped.labels["blobs_multiscale_labels"]
255255

256256
sdata_cropped.pl.render_shapes(["blobs_circles", "blobs_polygons"], color="annotation").pl.show()
257+
258+
def test_plot_can_stack_render_shapes(self, sdata_blobs: SpatialData):
259+
(
260+
sdata_blobs.pl.render_shapes(elements="blobs_circles", na_color="red", fill_alpha=0.5)
261+
.pl.render_shapes(elements="blobs_polygons", na_color="blue", fill_alpha=0.5)
262+
.pl.show()
263+
)

0 commit comments

Comments
 (0)