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:

---------------------------------------------------------------------------
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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions