diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index 488db5c9..5cd71168 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -394,6 +394,15 @@ def _render_shapes( scale = radius_numeric * render_params.scale shapes.loc[is_point, "geometry"] = _geometry[is_point].buffer(scale.to_numpy()) + # Handle polygon/multipolygon scaling + is_polygon = _geometry.type.isin(["Polygon", "MultiPolygon"]) + if is_polygon.any() and render_params.scale != 1.0: + from shapely import affinity + + shapes.loc[is_polygon, "geometry"] = _geometry[is_polygon].apply( + lambda geom: affinity.scale(geom, xfact=render_params.scale, yfact=render_params.scale) + ) + # apply transformations to the individual points tm = trans.get_matrix() transformed_geometry = shapes["geometry"].transform( diff --git a/tests/_images/Shapes_can_scale_polygons_datashader.png b/tests/_images/Shapes_can_scale_polygons_datashader.png new file mode 100644 index 00000000..a3da4a0e Binary files /dev/null and b/tests/_images/Shapes_can_scale_polygons_datashader.png differ diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index dece73b3..dd165ece 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -242,6 +242,10 @@ def test_plot_can_color_from_geodataframe(self, sdata_blobs: SpatialData): def test_plot_can_scale_shapes(self, sdata_blobs: SpatialData): sdata_blobs.pl.render_shapes(element="blobs_circles", scale=0.5).pl.show() + def test_plot_can_scale_polygons_datashader(self, sdata_blobs: SpatialData): + # Regression test for #473: scale parameter had no effect on polygons with datashader + sdata_blobs.pl.render_shapes(element="blobs_polygons", method="datashader", scale=2.0).pl.show() + def test_plot_can_filter_with_groups(self, sdata_blobs: SpatialData): _, axs = plt.subplots(nrows=1, ncols=2, layout="tight")