Skip to content

render_shapes fails when +1 shapes match single table.obs #475

@josenimo

Description

@josenimo

Hi,

render_shapes is not working as expected, I think I know why:

Simple sdata object:

SpatialData object, with associated Zarr store: [/Users/jnimoca/Jose_BI/1_Pipelines/openDVP/notebooks/outputs/spatialdata.zarr](https://file+.vscode-resource.vscode-cdn.net/Users/jnimoca/Jose_BI/1_Pipelines/openDVP/notebooks/outputs/spatialdata.zarr)
├── Images
│     └── 'mIF': DataArray[cyx] (15, 5000, 5000)
├── Shapes
│     └── 'Slide_P12': GeoDataFrame shape: (20, 4) (2D shapes)
└── Tables
      └── 'proteomics': AnnData (10, 4637)
with coordinate systems:
    ▸ 'global', with elements:
        mIF (Images), Slide_P12 (Shapes)

sdata['Slide_P12'] returns:
Image

sdata['proteomics'].obs returns:
Image

When trying to plot these shapes it fails:

sdata.pl.render_shapes(
        element="Slide_P12", 
        table_name="proteomics",
        color="IMPA2",
        cmap="viridis",
        norm=Normalize(vmin=10, vmax=15, clip=False)
    ).pl.show()

Traceback:

Details
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[87], line 7
      1 sdata.pl.render_shapes(
      2         element="Slide_P12", 
      3         table_name="proteomics",
      4         color="IMPA2",
      5         cmap="viridis",
      6         norm=Normalize(vmin=10, vmax=15, clip=False)
----> 7     ).pl.show()

File ~/Jose_BI/1_Pipelines/openDVP/.pixi/envs/spatialdata/lib/python3.12/site-packages/spatialdata_plot/pl/basic.py:936, 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)
    931     wanted_elements, wanted_shapes_on_this_cs, wants_shapes = _get_wanted_render_elements(
    932         sdata, wanted_elements, params_copy, cs, "shapes"
    933     )
    935     if wanted_shapes_on_this_cs:
--> 936         _render_shapes(
    937             sdata=sdata,
    938             render_params=params_copy,
    939             coordinate_system=cs,
    940             ax=ax,
    941             fig_params=fig_params,
    942             scalebar_params=scalebar_params,
    943             legend_params=legend_params,
    944         )
    946 elif cmd == "render_points" and has_points:
    947     wanted_elements, wanted_points_on_this_cs, wants_points = _get_wanted_render_elements(
    948         sdata, wanted_elements, params_copy, cs, "points"
    949     )

File ~/Jose_BI/1_Pipelines/openDVP/.pixi/envs/spatialdata/lib/python3.12/site-packages/spatialdata_plot/pl/render.py:110, in _render_shapes(sdata, render_params, coordinate_system, ax, fig_params, scalebar_params, legend_params)
    107     sdata_filt[table_name].obs[col_for_color] = sdata_filt[table_name].obs[col_for_color].astype("category")
    109 # get color vector (categorical or continuous)
--> 110 color_source_vector, color_vector, _ = _set_color_source_vec(
    111     sdata=sdata_filt,
    112     element=sdata_filt[element],
    113     element_name=element,
    114     value_to_plot=col_for_color,
    115     groups=groups,
    116     palette=render_params.palette,
    117     na_color=render_params.color or render_params.cmap_params.na_color,
    118     cmap_params=render_params.cmap_params,
    119     table_name=table_name,
    120     table_layer=table_layer,
    121 )
    123 values_are_categorical = color_source_vector is not None
    125 # color_source_vector is None when the values aren't categorical

File ~/Jose_BI/1_Pipelines/openDVP/.pixi/envs/spatialdata/lib/python3.12/site-packages/spatialdata_plot/pl/utils.py:732, in _set_color_source_vec(sdata, element, value_to_plot, na_color, element_name, groups, palette, cmap_params, alpha, table_name, table_layer, render_type)
    727     raise ValueError(
    728         f"Color key '{value_to_plot}' for element '{element_name}' been found in multiple locations: {origins}."
    729     )
    731 if len(origins) == 1:
--> 732     color_source_vector = get_values(
    733         value_key=value_to_plot,
    734         sdata=sdata,
    735         element_name=element_name,
    736         table_name=table_name,
    737         table_layer=table_layer,
    738     )[value_to_plot]
    740     # numerical case, return early
    741     # TODO temporary split until refactor is complete
    742     if color_source_vector is not None and not isinstance(color_source_vector.dtype, pd.CategoricalDtype):

File ~/Jose_BI/1_Pipelines/openDVP/.pixi/envs/spatialdata/lib/python3.12/site-packages/spatialdata/_core/query/relational_query.py:979, in get_values(value_key, element, sdata, element_name, table_name, table_layer, return_obsm_as_is)
    977     obs = matched_table.obs
    978     assert obs[region_key].nunique() == 1
--> 979     assert obs[instance_key].nunique() == len(matched_table)
    980 else:
    981     matched_table = element

AssertionError: 

check 1: there is data

Image

check 2: removing duplicate index from shapes element fixes it

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinginvalidThis doesn't seem rightshapes 🫧Anything related to Shapes

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions