spatialdata-plot icon indicating copy to clipboard operation
spatialdata-plot copied to clipboard

Using groups in pl.render_shapes() fails with large data

Open ConstensouxAlexis opened this issue 1 year ago • 1 comments

Hello, I work with spatialdata-plot version: 0.2.7.dev2+g6ffe22b on the following visium HD data: image I have annotated the 8um bins table with cell clusters: image When I do a subset of my spatialdata object and plot it using groups to select specific clusters, there is no issue: image The spatialdata crop contains all different clusters that are present in the whole spatialdata table: image For 10 different crops (always of size 500 * 500), the plotting function works fine

But when I want to generate the same plot with the whole spatialdata, it raises the following issue: image `--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[228], line 1 ----> 1 sdata.pl.render_shapes("features_square_008um", color="banksy_0.2_leiden_res_0.10", groups=["0"]).pl.show()

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/spatialdata_plot/pl/basic.py:879, in PlotAccessor.show(self, coordinate_systems, legend_fontsize, legend_fontweight, legend_loc, legend_fontoutline, na_in_legend, colorbar, wspace, hspace, ncols, frameon, figsize, dpi, fig, title, share_extent, pad_extent, ax, return_ax, save) 874 wanted_elements, wanted_shapes_on_this_cs, wants_shapes = _get_wanted_render_elements( 875 sdata, wanted_elements, params_copy, cs, "shapes" 876 ) 878 if wanted_shapes_on_this_cs: --> 879 _render_shapes( 880 sdata=sdata, 881 render_params=params_copy, 882 coordinate_system=cs, 883 ax=ax, 884 fig_params=fig_params, 885 scalebar_params=scalebar_params, 886 legend_params=legend_params, 887 ) 889 elif cmd == "render_points" and has_points: 890 wanted_elements, wanted_points_on_this_cs, wants_points = _get_wanted_render_elements( 891 sdata, wanted_elements, params_copy, cs, "points" 892 )

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/spatialdata_plot/pl/render.py:191, in _render_shapes(sdata, render_params, coordinate_system, ax, fig_params, scalebar_params, legend_params) 189 # in case we are coloring by a column in table 190 if col_for_color is not None and col_for_color not in sdata_filt.shapes[element].columns: --> 191 sdata_filt.shapes[element][col_for_color] = ( 192 color_vector if color_source_vector is None else color_source_vector 193 ) 194 # Render shapes with datashader 195 color_by_categorical = col_for_color is not None and color_source_vector is not None

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/geopandas/geodataframe.py:1819, in GeoDataFrame.setitem(self, key, value) 1814 except TypeError: 1815 warnings.warn( 1816 "Geometry column does not contain geometry.", 1817 stacklevel=2, 1818 ) -> 1819 super().setitem(key, value)

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/pandas/core/frame.py:4311, in DataFrame.setitem(self, key, value) 4308 self._setitem_array([key], value) 4309 else: 4310 # set column -> 4311 self._set_item(key, value)

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/pandas/core/frame.py:4524, in DataFrame._set_item(self, key, value) 4514 def _set_item(self, key, value) -> None: 4515 """ 4516 Add series to DataFrame in specified column. 4517 (...) 4522 ensure homogeneity. 4523 """ -> 4524 value, refs = self._sanitize_column(value) 4526 if ( 4527 key in self.columns 4528 and value.ndim == 1 4529 and not isinstance(value.dtype, ExtensionDtype) 4530 ): 4531 # broadcast across multiple columns if necessary 4532 if not self.columns.is_unique or isinstance(self.columns, MultiIndex):

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/pandas/core/frame.py:5266, in DataFrame._sanitize_column(self, value) 5263 return _reindex_for_setitem(value, self.index) 5265 if is_list_like(value): -> 5266 com.require_length_match(value, self.index) 5267 arr = sanitize_array(value, self.index, copy=True, allow_2d=True) 5268 if ( 5269 isinstance(value, Index) 5270 and value.dtype == "object" (...) 5273 # TODO: Remove kludge in sanitize_array for string mode when enforcing 5274 # this deprecation

File /data/kdi_prod/.kdi/project_workspace_0/1928/acl/03.00/code/envs/python_visium/lib/python3.10/site-packages/pandas/core/common.py:573, in require_length_match(data, index) 569 """ 570 Check the length of data matches the length of the index. 571 """ 572 if len(data) != len(index): --> 573 raise ValueError( 574 "Length of values " 575 f"({len(data)}) " 576 "does not match length of index " 577 f"({len(index)})" 578 )

ValueError: Length of values (246009) does not match length of index (696564)`

When plotting a crop of my spatialdata, the plotting backend is matplotlib, whereas it is datashader when I plot the whole spatialdata

ConstensouxAlexis avatar Sep 18 '24 12:09 ConstensouxAlexis

Hi, I think that the problem is due to this bug https://github.com/scverse/spatialdata-plot/issues/169. We will try to fix it the soonest.

You could try to see if switching plotting backend helps (you can use method='datashader' or method='matplotlib' in .render_shapes()). Also you could try using https://github.com/scverse/spatialdata-plot/pull/309. But I think that the issue is not backend related.

LucaMarconato avatar Oct 03 '24 17:10 LucaMarconato

Hi ! Thanks for answering (weirdly, using matoplotlib backend seems to fix that issue by the way)

ConstensouxAlexis avatar Nov 05 '24 10:11 ConstensouxAlexis

Thanks for the update. The recent PR https://github.com/scverse/spatialdata-plot/pull/396 should fix this issue. Closing, but feel free to reopen if the problem persists.

LucaMarconato avatar Jan 05 '25 14:01 LucaMarconato