From 35ee4ce098cc09126962a610645a0c7c233a62ce Mon Sep 17 00:00:00 2001 From: anon Date: Mon, 11 May 2026 21:36:21 +0200 Subject: [PATCH] Add render_graph for spatial connectivity visualization Adds sdata.pl.render_graph() to draw spatial graph edges from adjacency matrices stored in table.obsp, using element centroids as node positions. Supports shapes, points, and labels. Features: - Scalar / obs-categorical / obs-continuous / obsp-matrix edge coloring - Per-edge widths and alphas (scalar or from a weight matrix) - Group filtering (both endpoints must be in the requested groups) - Self-loop rendering as a CircleCollection - Integrated colorbar via the existing ColorbarSpec pipeline - Legend sharing with chained render_shapes / render_points - No new dependencies (no networkx) --- src/spatialdata_plot/pl/basic.py | 159 ++++++++- src/spatialdata_plot/pl/render.py | 220 ++++++++++++ src/spatialdata_plot/pl/render_params.py | 27 ++ src/spatialdata_plot/pl/utils.py | 318 ++++++++++++++++-- .../Graph_can_render_graph_on_labels.png | Bin 0 -> 112278 bytes .../Graph_can_render_graph_on_shapes.png | Bin 0 -> 32024 bytes ...ph_can_render_graph_with_groups_filter.png | Bin 0 -> 32426 bytes tests/pl/test_render_graph.py | 258 ++++++++++++++ 8 files changed, 956 insertions(+), 26 deletions(-) create mode 100644 tests/_images/Graph_can_render_graph_on_labels.png create mode 100644 tests/_images/Graph_can_render_graph_on_shapes.png create mode 100644 tests/_images/Graph_can_render_graph_with_groups_filter.png create mode 100644 tests/pl/test_render_graph.py diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 9adf5d19..38183fa8 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -4,7 +4,7 @@ import sys import warnings from collections import OrderedDict -from collections.abc import Callable +from collections.abc import Callable, Sequence from copy import deepcopy from pathlib import Path from typing import Any, Literal, cast @@ -25,12 +25,14 @@ from mpl_toolkits.axes_grid1.inset_locator import inset_axes from spatialdata import get_extent from spatialdata._utils import _deprecation_alias +from spatialdata.transformations.operations import get_transformation from xarray import DataArray, DataTree from spatialdata_plot._accessor import register_spatial_data_accessor from spatialdata_plot._logging import _log_context from spatialdata_plot.pl.render import ( _draw_channel_legend, + _render_graph, _render_images, _render_labels, _render_points, @@ -44,6 +46,7 @@ ChannelLegendEntry, CmapParams, ColorbarSpec, + GraphRenderParams, ImageRenderParams, LabelsRenderParams, LegendParams, @@ -64,6 +67,7 @@ _prepare_cmap_norm, _prepare_params_plot, _set_outline, + _validate_graph_render_params, _validate_image_render_params, _validate_label_render_params, _validate_points_render_params, @@ -856,6 +860,143 @@ def render_labels( n_steps += 1 return sdata + def render_graph( + self, + element: str | None = None, + color: ColorLike | None = None, + *, + connectivity_key: str = "spatial", + obsp_key: str | None = None, + palette: dict[str, str] | list[str] | str | None = None, + na_color: ColorLike | None = "default", + cmap: Colormap | str | None = None, + norm: Normalize | None = None, + groups: list[str] | str | None = None, + group_key: str | None = None, + edge_width: float | Literal["weight"] = 1.0, + edge_alpha: float | Literal["weight"] = 1.0, + weight_key: str | None = None, + linestyle: str | Sequence[str] = "solid", + rasterize: bool = True, + include_self_loops: bool = False, + colorbar: bool | str | None = "auto", + colorbar_params: dict[str, object] | None = None, + table_name: str | None = None, + ) -> sd.SpatialData: + """Render spatial graph edges between observations. + + Draws edges from a connectivity matrix in ``table.obsp`` using + centroid coordinates of the linked spatial element. + + Parameters + ---------- + element : str | None + Name of the shapes/points/labels element the graph connects. + Auto-resolved from the table if omitted. + color : ColorLike | None + A color-like value applied to every edge, or the name of a + ``table.obs`` column. Categorical columns colour same-category + edges by the shared value and cross-category edges by + ``na_color``. Continuous columns colour edges by the mean of + their endpoint values. Defaults to grey when unset. + connectivity_key : str, default "spatial" + ``table.obsp`` key. Tries ``key`` first, then ``f"{key}_connectivities"``. + obsp_key : str | None + ``table.obsp`` matrix used as per-edge scalar; coloured via + ``cmap``/``norm``. Mutually exclusive with ``color``. + palette : dict[str, str] | list[str] | str | None + Palette for categorical obs coloring. Same as :meth:`render_shapes`. + na_color : ColorLike | None, default "default" + Colour for cross-category edges. ``None`` makes them transparent. + cmap : Colormap | str | None + Colormap for continuous edge coloring. + norm : Normalize | None + Pass ``Normalize(vmin=..., vmax=...)`` to clamp the colormap range. + groups : list[str] | str | None + Show only edges where **both** endpoints fall in these groups. + Requires ``group_key``. + group_key : str | None + ``table.obs`` column used for group filtering. + edge_width : float | Literal["weight"], default 1.0 + Line width. Pass ``"weight"`` to scale by ``weight_key`` values + into ``[0.5, 3.0]``. + edge_alpha : float | Literal["weight"], default 1.0 + Transparency. Pass ``"weight"`` to scale into ``[0.2, 1.0]``. + weight_key : str | None + ``table.obsp`` matrix providing per-edge weights. Defaults to + ``connectivity_key`` when omitted. + linestyle : str | Sequence[str], default "solid" + ``LineCollection`` linestyle (scalar or per-edge). + rasterize : bool, default True + Rasterize the edge collection. Set ``False`` for vector output. + include_self_loops : bool, default False + Render diagonal entries of the connectivity matrix as circles. + colorbar : bool | str | None, default "auto" + Whether to draw a colorbar for continuous edge coloring + (``obsp_key`` or a continuous obs column). ``"auto"`` draws it + when a mappable is present; ``True``/``False`` force it on/off. + colorbar_params : dict[str, object] | None + Optional matplotlib colorbar kwargs and layout hints + (e.g. ``{"loc": "right", "fraction": 0.05, "label": "..."}``). + table_name : str | None + Table containing the graph. Auto-discovered if omitted. + + Returns + ------- + sd.SpatialData + Copy with rendering parameters stored in the plotting tree. + + Notes + ----- + Chaining with ``render_shapes``/``render_points`` on the same + categorical column shares the legend; no dedicated edge legend is drawn. + """ + params = _validate_graph_render_params( + self._sdata, + element=element, + connectivity_key=connectivity_key, + obsp_key=obsp_key, + weight_key=weight_key, + palette=palette, + na_color=na_color, + cmap=cmap, + norm=norm, + table_name=table_name, + color=color, + edge_width=edge_width, + edge_alpha=edge_alpha, + groups=groups, + group_key=group_key, + ) + + sdata = self._copy() + sdata = _verify_plotting_tree(sdata) + n_steps = len(sdata.plotting_tree.keys()) + sdata.plotting_tree[f"{n_steps + 1}_render_graph"] = GraphRenderParams( + element=params["element"], + connectivity_obsp_key=params["connectivity_obsp_key"], + table_name=params["table_name"], + color=params["color"], + obs_col=params["obs_col"], + obsp_key=params["obsp_key"], + cmap_params=params["cmap_params"], + palette_map=params["palette_map"], + na_color=params["na_color"], + color_source=params["color_source"], + groups=params["groups"], + group_key=params["group_key"], + edge_width=params["edge_width"], + edge_alpha=params["edge_alpha"], + weight_key=params["weight_key"], + linestyle=linestyle, + rasterize=rasterize, + include_self_loops=include_self_loops, + zorder=n_steps, + colorbar=colorbar, + colorbar_params=colorbar_params, + ) + return sdata + def show( self, coordinate_systems: list[str] | str | None = None, @@ -1020,6 +1161,7 @@ def show( "render_shapes", "render_labels", "render_points", + "render_graph", ] # prepare rendering params @@ -1340,6 +1482,21 @@ def _draw_colorbar( rasterize=rasterize, ) + elif cmd == "render_graph": + graph_element = params_copy.element + element_in_cs = graph_element in sdata and cs in set( + get_transformation(sdata[graph_element], get_all=True).keys() + ) + if element_in_cs: + _render_graph( + sdata=sdata, + render_params=params_copy, + coordinate_system=cs, + ax=ax, + legend_params=legend_params_obj, + colorbar_requests=axis_colorbar_requests, + ) + if title is None: t = cs elif len(title) == 1: diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index 4da2cfa6..d97bb474 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -49,6 +49,7 @@ Color, ColorbarSpec, FigParams, + GraphRenderParams, ImageRenderParams, LabelsRenderParams, LegendParams, @@ -1834,3 +1835,222 @@ def _draw_labels( col_for_color if isinstance(col_for_color, str) else None, ), ) + + +def _normalise_to_range(values: np.ndarray, lo: float, hi: float) -> np.ndarray: + """Min-max normalise a 1-D array into ``[lo, hi]``. Constant input → midpoint.""" + if len(values) == 0: + return values + vmin = float(np.nanmin(values)) + vmax = float(np.nanmax(values)) + if not np.isfinite(vmin) or not np.isfinite(vmax) or vmax - vmin == 0.0: + return np.full_like(values, (lo + hi) / 2.0, dtype=float) + return lo + (values - vmin) * (hi - lo) / (vmax - vmin) + + +def _render_graph( + sdata: sd.SpatialData, + render_params: GraphRenderParams, + coordinate_system: str, + ax: matplotlib.axes.SubplotBase, + legend_params: LegendParams | None = None, + colorbar_requests: list[ColorbarSpec] | None = None, +) -> None: + """Render spatial graph edges as a LineCollection on the given axes.""" + from matplotlib.collections import CircleCollection, LineCollection + from scipy.sparse import triu + + _log_context.set("render_graph") + element_name = render_params.element + table_name = render_params.table_name + + table = sdata[table_name] + adjacency_key = render_params.connectivity_obsp_key + if adjacency_key not in table.obsp: + logger.warning(f"Connectivity key '{adjacency_key}' not found in table obsp. Skipping graph rendering.") + return + + adjacency = table.obsp[adjacency_key] + element = sdata[element_name] + centroids_df = sd.get_centroids(element, coordinate_system=coordinate_system) + if hasattr(centroids_df, "compute"): + centroids_df = centroids_df.compute() + + centroid_coords = np.column_stack([centroids_df["x"].values, centroids_df["y"].values]) + + _, region_key, instance_key = get_table_keys(table) + element_mask = table.obs[region_key].values == element_name + instance_ids = table.obs[instance_key].values[element_mask] + table_subset_indices = np.where(element_mask)[0] + + centroid_ids = np.asarray(centroids_df.index.values) + # Vectorised join: for each instance_id in the table subset, locate the + # matching row in centroid_ids. searchsorted requires a sorted index, which + # we can't assume, so fall back on isin + argsort for correctness. + order = np.argsort(centroid_ids) + sorted_ids = centroid_ids[order] + positions = np.searchsorted(sorted_ids, instance_ids) + positions = np.clip(positions, 0, len(sorted_ids) - 1) + found = sorted_ids[positions] == instance_ids + centroid_rows = order[positions] + + has_coord = np.zeros(table.n_obs, dtype=bool) + coords = np.full((table.n_obs, 2), np.nan) + matched_table_rows = table_subset_indices[found] + has_coord[matched_table_rows] = True + coords[matched_table_rows] = centroid_coords[centroid_rows[found]] + + groups = render_params.groups + group_key = render_params.group_key + if groups is not None and group_key is not None: + in_groups = np.isin(table.obs[group_key].values, groups) + has_coord &= in_groups + + coords[~has_coord] = np.nan + + # Per-edge attribute arrays are built in triu(adj, k=1).nonzero() order so + # the NaN-coord mask below subsets them consistently. + adj_upper = triu(adjacency, k=1) + all_rows, all_cols = adj_upper.nonzero() + + edge_color_arg: Any = "grey" + cmap_for_render = None + norm_for_render = None + cmap_params = render_params.cmap_params + + if render_params.color_source == "obsp": + value_matrix = table.obsp[render_params.obsp_key] + edge_color_arg = value_matrix[all_rows, all_cols].A1 + elif render_params.color_source in {"obs_continuous", "obs_categorical"}: + obs_series = table.obs[render_params.obs_col] + na_hex = render_params.na_color.get_hex_with_alpha() if render_params.na_color is not None else "#00000000" + if obs_series.isna().all(): + logger.warning(f"Column '{render_params.obs_col}' contains only NaN values; rendering edges with na_color.") + edge_color_arg = np.full(len(all_rows), na_hex, dtype=object) + elif render_params.color_source == "obs_continuous": + obs_values = np.asarray(obs_series.values, dtype=float) + edge_color_arg = 0.5 * (obs_values[all_rows] + obs_values[all_cols]) + else: + obs_values = obs_series.values + row_vals = obs_values[all_rows] + col_vals = obs_values[all_cols] + # Pre-fill with na_hex, then look up palette colours only for shared-endpoint edges. + palette_map = render_params.palette_map or {} + same = row_vals == col_vals + per_edge_colors = np.full(len(row_vals), na_hex, dtype=object) + if same.any(): + per_edge_colors[same] = [palette_map.get(v, na_hex) for v in row_vals[same]] + edge_color_arg = per_edge_colors + else: + edge_color_arg = (render_params.color or Color("grey")).get_hex() + + if render_params.color_source in {"obsp", "obs_continuous"} and cmap_params is not None: + cmap_for_render = cmap_params.cmap + norm_for_render = cmap_params.norm + + edge_width_arg: Any = render_params.edge_width + edge_alpha_arg: Any = render_params.edge_alpha + if render_params.edge_width == "weight" or render_params.edge_alpha == "weight": + weight_matrix = table.obsp[render_params.weight_key] + weights = weight_matrix[all_rows, all_cols].A1.astype(float) + if render_params.edge_width == "weight": + edge_width_arg = _normalise_to_range(weights, 0.5, 3.0) + if render_params.edge_alpha == "weight": + edge_alpha_arg = _normalise_to_range(weights, 0.2, 1.0) + + # Drop edges touching nodes without valid coords, and align per-edge arrays. + edge_mask = has_coord[all_rows] & has_coord[all_cols] + rows = all_rows[edge_mask] + cols = all_cols[edge_mask] + + def _maybe_subset(value: Any) -> Any: + if isinstance(value, np.ndarray) and value.ndim == 1 and len(value) == len(edge_mask): + return value[edge_mask] + return value + + edge_color_arg = _maybe_subset(edge_color_arg) + edge_width_arg = _maybe_subset(edge_width_arg) + edge_alpha_arg = _maybe_subset(edge_alpha_arg) + + if len(rows) == 0: + lc = LineCollection([]) + ax.add_collection(lc) + return + + segments = np.stack([coords[rows], coords[cols]], axis=1) + + lc_kwargs: dict[str, Any] = { + "linewidths": edge_width_arg, + "alpha": edge_alpha_arg, + "linestyles": render_params.linestyle, + "zorder": render_params.zorder, + } + + is_numeric_array = ( + isinstance(edge_color_arg, np.ndarray) + and edge_color_arg.ndim == 1 + and np.issubdtype(edge_color_arg.dtype, np.number) + ) + lc = LineCollection(segments, **lc_kwargs) + if is_numeric_array: + lc.set_array(edge_color_arg) + if cmap_for_render is not None: + lc.set_cmap(cmap_for_render) + if norm_for_render is not None: + lc.set_norm(norm_for_render) + else: + lc.set_color(edge_color_arg) + lc.set_rasterized(render_params.rasterize) + ax.add_collection(lc) + + if render_params.include_self_loops: + diag = np.asarray(adjacency.diagonal()).ravel() + sl_rows = np.where(diag != 0)[0] + sl_rows = sl_rows[has_coord[sl_rows]] + if len(sl_rows) > 0: + edge_lengths = np.linalg.norm(segments[:, 1] - segments[:, 0], axis=1) + median_len = float(np.median(edge_lengths)) if len(edge_lengths) else 1.0 + sl_color = edge_color_arg if isinstance(edge_color_arg, str) else "grey" + sl_alpha = edge_alpha_arg if isinstance(edge_alpha_arg, int | float) else 1.0 + cc = CircleCollection( + sizes=[max(median_len * 2.0, 4.0)] * len(sl_rows), + offsets=coords[sl_rows], + transOffset=ax.transData, + facecolors=sl_color, + edgecolors="none", + alpha=sl_alpha, + zorder=render_params.zorder, + ) + cc.set_rasterized(render_params.rasterize) + ax.add_collection(cc) + + is_continuous = render_params.color_source in {"obsp", "obs_continuous"} + should_request = _should_request_colorbar( + render_params.colorbar, + has_mappable=render_params.cmap_params is not None, + is_continuous=is_continuous, + ) + if ( + should_request + and colorbar_requests is not None + and legend_params is not None + and legend_params.colorbar + and render_params.cmap_params is not None + ): + sm = plt.cm.ScalarMappable( + cmap=render_params.cmap_params.cmap, + norm=render_params.cmap_params.norm, + ) + sm.set_array(lc.get_array()) + label = _resolve_colorbar_label( + render_params.colorbar_params, + fallback=render_params.obs_col or render_params.obsp_key, + ) + colorbar_requests.append( + ColorbarSpec( + ax=ax, + mappable=sm, + params=render_params.colorbar_params, + label=label, + ) + ) diff --git a/src/spatialdata_plot/pl/render_params.py b/src/spatialdata_plot/pl/render_params.py index bc69f16a..e7232ec7 100644 --- a/src/spatialdata_plot/pl/render_params.py +++ b/src/spatialdata_plot/pl/render_params.py @@ -309,3 +309,30 @@ class LabelsRenderParams: zorder: int = 0 colorbar: bool | str | None = "auto" colorbar_params: dict[str, object] | None = None + + +@dataclass +class GraphRenderParams: + """Graph render parameters.""" + + element: str + connectivity_obsp_key: str = "spatial_connectivities" + table_name: str | None = None + color: Color | None = None + obs_col: str | None = None + obsp_key: str | None = None + cmap_params: CmapParams | None = None + palette_map: dict[str, str] | None = None + na_color: Color | None = None + color_source: Literal["scalar", "obsp", "obs_categorical", "obs_continuous"] = "scalar" + groups: list[str] | str | None = None + group_key: str | None = None + edge_width: float | Literal["weight"] = 1.0 + edge_alpha: float | Literal["weight"] = 1.0 + weight_key: str | None = None + linestyle: str | Sequence[str] = "solid" + rasterize: bool = True + include_self_loops: bool = False + zorder: int = 0 + colorbar: bool | str | None = "auto" + colorbar_params: dict[str, object] | None = None diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index bcdcb0dd..a675e00e 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -75,6 +75,7 @@ Color, ColorbarSpec, FigParams, + GraphRenderParams, ImageRenderParams, LabelsRenderParams, OutlineParams, @@ -2098,7 +2099,7 @@ def _get_elements_to_be_rendered( render_cmds: list[ tuple[ str, - ImageRenderParams | LabelsRenderParams | PointsRenderParams | ShapesRenderParams, + ImageRenderParams | LabelsRenderParams | PointsRenderParams | ShapesRenderParams | GraphRenderParams, ] ], cs_index: pd.DataFrame, @@ -2125,9 +2126,14 @@ def _get_elements_to_be_rendered( cs_row = cs_index.loc[cs] if cs in cs_index.index else None for cmd, params in render_cmds: - key = _RENDER_CMD_TO_CS_FLAG.get(cmd) - if key and cs_row is not None and cs_row[key]: + if cmd == "render_graph": + # Graph doesn't have its own CS flag; include its element so + # _get_valid_cs keeps the coordinate system alive. elements_to_be_rendered.append(params.element) + else: + key = _RENDER_CMD_TO_CS_FLAG.get(cmd) + if key and cs_row is not None and cs_row[key]: + elements_to_be_rendered.append(params.element) return elements_to_be_rendered @@ -2319,29 +2325,29 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st "shapes", "points", "labels", + "graph", }: if not isinstance(color, str | tuple | list): raise TypeError("Parameter 'color' must be a string or a tuple/list of floats.") - if element_type in {"shapes", "points", "labels"}: - if _is_color_like(color): - logger.info("Value for parameter 'color' appears to be a color, using it as such.") - param_dict["col_for_color"] = None - param_dict["color"] = Color(color) - if param_dict["color"].alpha_is_user_defined(): - if element_type == "points" and param_dict.get("alpha") is None: - param_dict["alpha"] = param_dict["color"].get_alpha_as_float() - elif element_type in {"shapes", "labels"} and param_dict.get("fill_alpha") is None: - param_dict["fill_alpha"] = param_dict["color"].get_alpha_as_float() - else: - logger.info( - f"Alpha implied by color '{color}' is ignored since the parameter 'alpha' or 'fill_alpha' " - "is set and its value takes precedence." - ) - elif isinstance(color, str): - param_dict["col_for_color"] = color - param_dict["color"] = None - else: - raise ValueError(f"{color} is not a valid RGB(A) array and therefore can't be used as 'color' value.") + if _is_color_like(color): + logger.info("Value for parameter 'color' appears to be a color, using it as such.") + param_dict["col_for_color"] = None + param_dict["color"] = Color(color) + if param_dict["color"].alpha_is_user_defined(): + if element_type == "points" and param_dict.get("alpha") is None: + param_dict["alpha"] = param_dict["color"].get_alpha_as_float() + elif element_type in {"shapes", "labels"} and param_dict.get("fill_alpha") is None: + param_dict["fill_alpha"] = param_dict["color"].get_alpha_as_float() + else: + logger.info( + f"Alpha implied by color '{color}' is ignored since the parameter 'alpha' or 'fill_alpha' " + "is set and its value takes precedence." + ) + elif isinstance(color, str): + param_dict["col_for_color"] = color + param_dict["color"] = None + else: + raise ValueError(f"{color} is not a valid RGB(A) array and therefore can't be used as 'color' value.") elif "color" in param_dict and element_type != "images": param_dict["col_for_color"] = None @@ -2467,7 +2473,7 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st elif isinstance(palette, list): if not all(isinstance(p, str) for p in palette): raise ValueError("If specified, parameter 'palette' must contain only strings.") - elif isinstance(palette, str | type(None)) and "palette" in param_dict: + elif isinstance(palette, str | type(None)) and "palette" in param_dict and element_type != "graph": param_dict["palette"] = [palette] if palette is not None else None palette_group = param_dict.get("palette") @@ -2485,7 +2491,7 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st if not all(isinstance(c, Colormap | str) for c in cmap): raise TypeError("Each item in 'cmap' list must be a string or a Colormap.") elif isinstance(cmap, Colormap | str | type(None)): - if "cmap" in param_dict: + if "cmap" in param_dict and element_type != "graph": param_dict["cmap"] = [cmap] if cmap is not None else None else: raise TypeError("Parameter 'cmap' must be a string, a Colormap, or a list of these types.") @@ -2508,6 +2514,8 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st raise TypeError("Parameter 'norm' must be of type Normalize.") if element_type in {"shapes", "points"} and not isinstance(norm, bool | Normalize): raise TypeError("Parameter 'norm' must be a boolean or a mpl.Normalize.") + if element_type == "graph" and not isinstance(norm, Normalize): + raise TypeError("Parameter 'norm' must be a Normalize instance.") scale = param_dict.get("scale") if scale is not None: @@ -2601,6 +2609,35 @@ def _ensure_table_and_layer_exist_in_sdata( if ds_reduction and (ds_reduction not in valid_ds_reduction_methods): raise ValueError(f"Parameter 'ds_reduction' must be one of the following: {valid_ds_reduction_methods}.") + if element_type == "graph": + for key in ("connectivity_key",): + val = param_dict.get(key) + if val is not None and not isinstance(val, str): + raise TypeError(f"Parameter '{key}' must be a string.") + + for key in ("obsp_key", "weight_key", "group_key"): + val = param_dict.get(key) + if val is not None and not isinstance(val, str): + raise TypeError(f"Parameter '{key}' must be a string or None.") + + for key in ("edge_width", "edge_alpha"): + val = param_dict.get(key) + if val == "weight": + continue + if not isinstance(val, float | int): + raise TypeError(f"Parameter '{key}' must be numeric or the literal string 'weight'.") + if val < 0: + raise ValueError(f"Parameter '{key}' cannot be negative.") + + linestyle = param_dict.get("linestyle") + if linestyle is not None and not isinstance(linestyle, str | list | tuple): + raise TypeError("Parameter 'linestyle' must be a string or a sequence of strings.") + + for key in ("include_self_loops", "rasterize"): + val = param_dict.get(key) + if val is not None and not isinstance(val, bool): + raise TypeError(f"Parameter '{key}' must be a boolean.") + return param_dict @@ -2857,6 +2894,237 @@ def _resolve_gene_symbols( return str(adata.var.index[mask][0]) +def _validate_graph_render_params( + sdata: SpatialData, + element: str | None, + connectivity_key: str, + table_name: str | None, + color: ColorLike | None, + edge_width: float | Literal["weight"], + edge_alpha: float | Literal["weight"], + groups: list[str] | str | None, + group_key: str | None, + obsp_key: str | None = None, + weight_key: str | None = None, + palette: dict[str, str] | list[str] | str | None = None, + na_color: ColorLike | None = "default", + cmap: Colormap | str | None = None, + norm: Normalize | None = None, + linestyle: str | Sequence[str] = "solid", + include_self_loops: bool = False, + rasterize: bool = True, +) -> dict[str, Any]: + """Validate and resolve parameters for render_graph.""" + param_dict: dict[str, Any] = { + "sdata": sdata, + "element": element, + "color": color, + "groups": groups, + "palette": palette, + "na_color": na_color, + "cmap": cmap, + "norm": norm if norm is not None else Normalize(clip=False), + "table_name": table_name, + "connectivity_key": connectivity_key, + "obsp_key": obsp_key, + "weight_key": weight_key, + "group_key": group_key, + "edge_width": edge_width, + "edge_alpha": edge_alpha, + "linestyle": linestyle, + "include_self_loops": include_self_loops, + "rasterize": rasterize, + } + param_dict = _type_check_params(param_dict, "graph") + + if param_dict["table_name"] is None: + candidates = [tname for tname in sdata.tables if _resolve_obsp_key(sdata[tname], connectivity_key) is not None] + if len(candidates) == 0: + raise ValueError( + f"No table found with connectivity key '{connectivity_key}' in obsp. " + f"Available tables: {list(sdata.tables.keys())}." + ) + if len(candidates) > 1: + raise ValueError( + f"Multiple tables contain connectivity key '{connectivity_key}': {candidates}. " + "Please specify `table_name` explicitly." + ) + param_dict["table_name"] = candidates[0] + + if param_dict["table_name"] not in sdata.tables: + raise KeyError(f"Table '{param_dict['table_name']}' not found. Available: {list(sdata.tables.keys())}.") + + table = sdata[param_dict["table_name"]] + connectivity_obsp_key = _require_obsp_key(table, connectivity_key, param_name="connectivity_key") + + _, region_key, _ = get_table_keys(table) + if region_key is None: + raise ValueError( + f"Table '{param_dict['table_name']}' has no `region_key`; cannot associate its observations " + "with a spatial element. Re-parse the table with `TableModel.parse(..., region_key=...)`." + ) + + if param_dict["element"] is None: + regions = table.obs[region_key].unique().tolist() + spatial_regions = [r for r in regions if r in sdata.shapes or r in sdata.points or r in sdata.labels] + if len(spatial_regions) == 0: + raise ValueError( + f"Table '{param_dict['table_name']}' does not annotate any spatial element. Region values: {regions}." + ) + if len(spatial_regions) > 1: + raise ValueError( + f"Table '{param_dict['table_name']}' annotates multiple spatial elements: {spatial_regions}. " + "Please specify `element` explicitly." + ) + param_dict["element"] = spatial_regions[0] + elif not ( + param_dict["element"] in sdata.shapes + or param_dict["element"] in sdata.points + or param_dict["element"] in sdata.labels + ): + raise KeyError( + f"Element '{param_dict['element']}' not found in shapes, points, or labels. " + f"Available: shapes={list(sdata.shapes.keys())}, " + f"points={list(sdata.points.keys())}, labels={list(sdata.labels.keys())}." + ) + + # _type_check_params normalised string groups → list; renormalise the working set here. + if param_dict["groups"] is not None and param_dict["group_key"] is None: + raise ValueError("`groups` requires `group_key` to be specified.") + if param_dict["group_key"] is not None and param_dict["group_key"] not in table.obs.columns: + raise KeyError( + f"`group_key='{param_dict['group_key']}'` not found in table obs columns. " + f"Available: {list(table.obs.columns)}." + ) + if param_dict["groups"] is not None and param_dict["group_key"] is not None: + groups_set: set[Any] = set(param_dict["groups"]) + available_groups = set(table.obs[param_dict["group_key"]].dropna().unique()) + missing_groups = groups_set - available_groups + if missing_groups: + try: + missing_str = str(sorted(missing_groups)) + except TypeError: + missing_str = str(list(missing_groups)) + if missing_groups == groups_set: + logger.warning( + f"None of the requested groups {missing_str} were found in column " + f"'{param_dict['group_key']}'. Resulting plot will contain no edges." + ) + else: + logger.warning( + f"Groups {missing_str} not found in column '{param_dict['group_key']}' and will be ignored." + ) + + # After _type_check_params: col_for_color is the non-color string user passed via `color=`; + # color is either a Color (user gave a real color) or None (user gave a column name or nothing). + col_for_color = param_dict.get("col_for_color") + if col_for_color is not None and col_for_color not in table.obs.columns: + raise ValueError( + f"`color='{col_for_color}'` is not a matplotlib color and was not found in " + f"`table.obs` columns. Available obs columns: {list(table.obs.columns)}." + ) + + color_is_obs_col = col_for_color is not None + if obsp_key is not None and color_is_obs_col: + raise ValueError( + "Cannot set both `color` (as an obs column) and `obsp_key` for edge coloring. " + "Pick one source: scalar color, obs-column color, or obsp-matrix color." + ) + if obsp_key is not None and param_dict["color"] is not None: + raise ValueError( + "Cannot set both `color` and `obsp_key` for edge coloring. " + "Use `obsp_key` for matrix-driven coloring with `cmap`/`norm`, " + "or `color` for a scalar / obs-column-driven coloring." + ) + + color_obsp_key: str | None = None + obs_col: str | None = None + color_source: str = "scalar" + cmap_params: CmapParams | None = None + palette_map: dict[str, str] | None = None + + if obsp_key is not None: + color_obsp_key = _require_obsp_key(table, obsp_key, param_name="obsp_key") + color_source = "obsp" + cmap_params = _prepare_cmap_norm(cmap=cmap, norm=param_dict["norm"]) + elif color_is_obs_col: + obs_col = col_for_color + obs_values = table.obs[obs_col] + if isinstance(obs_values.dtype, pd.CategoricalDtype) or obs_values.dtype == object: + color_source = "obs_categorical" + categories = ( + obs_values.cat.categories.tolist() + if isinstance(obs_values.dtype, pd.CategoricalDtype) + else sorted(obs_values.dropna().unique().tolist()) + ) + if isinstance(palette, dict): + missing = [c for c in categories if c not in palette] + if missing: + raise KeyError( + f"Palette dict is missing entries for categories: {missing}. " + f"Available categories: {categories}." + ) + palette_map = {c: palette[c] for c in categories} + else: + cat_colors = _get_colors_for_categorical_obs(categories=categories, palette=palette) + palette_map = dict(zip(categories, cat_colors, strict=True)) + else: + color_source = "obs_continuous" + cmap_params = _prepare_cmap_norm(cmap=cmap, norm=param_dict["norm"]) + + # When edge_width/edge_alpha="weight" but weight_key isn't given, fall back to the + # connectivity matrix so binary graphs still produce a per-edge array. + resolved_weight_key: str | None = None + if edge_width == "weight" or edge_alpha == "weight": + resolved_weight_key = _require_obsp_key( + table, weight_key if weight_key is not None else connectivity_key, param_name="weight_key" + ) + + edge_color = param_dict["color"] if param_dict["color"] is not None else Color("grey") + parsed_na_color = param_dict["na_color"] + + return { + "element": param_dict["element"], + "connectivity_key": connectivity_key, + "connectivity_obsp_key": connectivity_obsp_key, + "obsp_key": color_obsp_key, + "obs_col": obs_col, + "cmap_params": cmap_params, + "palette_map": palette_map, + "na_color": parsed_na_color, + "color_source": color_source, + "table_name": param_dict["table_name"], + "weight_key": resolved_weight_key, + "color": edge_color, + "edge_width": edge_width, + "edge_alpha": edge_alpha, + "groups": param_dict["groups"], + "group_key": param_dict["group_key"], + } + + +def _resolve_obsp_key(table: AnnData, connectivity_key: str) -> str | None: + """Resolve connectivity_key to an actual obsp key. Accepts full key or prefix.""" + if connectivity_key in table.obsp: + return connectivity_key + suffixed = f"{connectivity_key}_connectivities" + if suffixed in table.obsp: + return suffixed + return None + + +def _require_obsp_key(table: AnnData, key: str, *, param_name: str) -> str: + """Resolve key (with prefix fallback) or raise KeyError.""" + resolved = _resolve_obsp_key(table, key) + if resolved is None: + raise KeyError( + f"`{param_name}='{key}'` not found in `table.obsp`. " + f"Tried '{key}' and '{key}_connectivities'. " + f"Available obsp keys: {list(table.obsp.keys())}." + ) + return resolved + + def _validate_col_for_column_table( sdata: SpatialData, element_name: str, diff --git a/tests/_images/Graph_can_render_graph_on_labels.png b/tests/_images/Graph_can_render_graph_on_labels.png new file mode 100644 index 0000000000000000000000000000000000000000..7a60beea0a284945e2c6fd6104560702b4ad105e GIT binary patch literal 112278 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%0DA^+Q5;2 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

r}8E8zbt_nzsyx{_y_AyV_I%^C*bUN~L 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 GgZ~F3X|VkO literal 0 HcmV?d00001 diff --git a/tests/_images/Graph_can_render_graph_on_shapes.png b/tests/_images/Graph_can_render_graph_on_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..001ddbabbaa7446c9fabb77ba99bf8467c9f151e GIT binary patch literal 32024 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�(vmdZbR^^NXjrbGVr`c3v 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 literal 0 HcmV?d00001 diff --git a/tests/pl/test_render_graph.py b/tests/pl/test_render_graph.py new file mode 100644 index 00000000..96dca213 --- /dev/null +++ b/tests/pl/test_render_graph.py @@ -0,0 +1,258 @@ +import geopandas as gpd +import matplotlib +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +import scanpy as sc +import spatialdata as sd +from anndata import AnnData +from matplotlib.collections import CircleCollection, LineCollection +from scipy.sparse import csr_matrix, lil_matrix, triu +from scipy.spatial import KDTree +from shapely.geometry import Point +from spatialdata import SpatialData +from spatialdata.datasets import blobs +from spatialdata.models import ShapesModel, TableModel + +import spatialdata_plot # noqa: F401 +from spatialdata_plot._logging import logger, logger_warns +from tests.conftest import DPI, PlotTester, PlotTesterMeta, get_standard_RNG + +sc.pl.set_rcParams_defaults() +sc.set_figure_params(dpi=DPI, color_map="viridis") +matplotlib.use("agg") +_ = spatialdata_plot + + +def _knn_adjacency(coords: np.ndarray, k: int = 3) -> csr_matrix: + n = len(coords) + adj = lil_matrix((n, n)) + tree = KDTree(coords) + for i in range(n): + _, neighbors = tree.query(coords[i], k=min(k + 1, n)) + for j in neighbors[1:]: + adj[i, j] = adj[j, i] = 1.0 + return adj.tocsr() + + +def _sdata_with_graph_on_shapes() -> SpatialData: + rng = get_standard_RNG() + n = 20 + coords = rng.uniform(10, 90, size=(n, 2)) + shapes = ShapesModel.parse( + gpd.GeoDataFrame(geometry=[Point(x, y) for x, y in coords], data={"radius": np.ones(n) * 2.5}) + ) + adata = AnnData(rng.normal(size=(n, 5))) + adata.obs["instance_id"] = np.arange(n) + adata.obs["region"] = "my_shapes" + adata.obs["cell_type"] = pd.Categorical(rng.choice(["tumor", "immune", "stroma"], size=n)) + adata.obsp["spatial_connectivities"] = _knn_adjacency(coords, k=3) + table = TableModel.parse(adata, region="my_shapes", region_key="region", instance_key="instance_id") + return SpatialData(shapes={"my_shapes": shapes}, tables={"table": table}) + + +def _sdata_with_graph_on_labels() -> SpatialData: + sdata = blobs() + table = sdata["table"] + centroids = sd.get_centroids(sdata["blobs_labels"]).compute() + coords = centroids.loc[table.obs["instance_id"].values, ["x", "y"]].to_numpy() + table.obsp["spatial_connectivities"] = _knn_adjacency(coords, k=3) + return sdata + + +def _sdata_with_weighted_graph() -> SpatialData: + sdata = _sdata_with_graph_on_shapes() + adj = sdata["table"].obsp["spatial_connectivities"].copy().astype(float).tolil() + rng = get_standard_RNG() + for r, c in zip(*adj.nonzero(), strict=True): + adj[r, c] = float(rng.uniform(0.1, 5.0)) + sdata["table"].obsp["spatial_distances"] = adj.tocsr() + return sdata + + +class TestGraph(PlotTester, metaclass=PlotTesterMeta): + def test_plot_can_render_graph_on_shapes(self): + sdata = _sdata_with_graph_on_shapes() + sdata.pl.render_graph("my_shapes", table_name="table").pl.render_shapes("my_shapes").pl.show() + + def test_plot_can_render_graph_on_labels(self): + sdata = _sdata_with_graph_on_labels() + ( + sdata.pl.render_images("blobs_image") + .pl.render_graph("blobs_labels", table_name="table", edge_alpha=0.5) + .pl.render_labels("blobs_labels") + .pl.show() + ) + + def test_plot_can_render_graph_with_groups_filter(self): + sdata = _sdata_with_graph_on_shapes() + ( + sdata.pl.render_graph("my_shapes", table_name="table", group_key="cell_type", groups=["tumor"]) + .pl.render_shapes("my_shapes", color="cell_type") + .pl.show() + ) + + +def test_render_graph_empty_graph_does_not_error(): + sdata = _sdata_with_graph_on_shapes() + sdata["table"].obsp["spatial_connectivities"] = csr_matrix((20, 20)) + sdata.pl.render_graph("my_shapes", table_name="table").pl.render_shapes("my_shapes").pl.show() + + +def test_render_graph_auto_discovers_element_and_table(): + sdata = _sdata_with_graph_on_shapes() + step_key, params = next(iter(sdata.pl.render_graph().plotting_tree.items())) + assert step_key.endswith("_render_graph") + assert params.element == "my_shapes" and params.table_name == "table" + + +@pytest.mark.parametrize( + ("kwargs", "match"), + [ + ({"connectivity_key": "nonexistent"}, "not found in `table.obsp`"), + ({"element": "no_such_element"}, "not found in shapes, points, or labels"), + ({"groups": ["tumor"]}, "`groups` requires `group_key`"), + ({"color": None, "obsp_key": "no_such"}, "`obsp_key='no_such'` not found"), + ({"edge_width": "weight", "weight_key": "no_such"}, "`weight_key='no_such'` not found"), + ], +) +def test_render_graph_error_paths(kwargs, match): + sdata = _sdata_with_graph_on_shapes() + element = kwargs.pop("element", "my_shapes") + with pytest.raises((KeyError, ValueError), match=match): + sdata.pl.render_graph(element, table_name="table", **kwargs) + + +def test_render_graph_rejects_color_and_obsp_key_together(): + sdata = _sdata_with_weighted_graph() + with pytest.raises(ValueError, match="Cannot set both `color` and `obsp_key`"): + sdata.pl.render_graph("my_shapes", table_name="table", color="red", obsp_key="spatial_distances") + + +def test_render_graph_warns_on_groups_not_in_column(caplog): + sdata = _sdata_with_graph_on_shapes() + with logger_warns(caplog, logger, match="not_a_real_group"): + sdata.pl.render_graph("my_shapes", table_name="table", group_key="cell_type", groups=["not_a_real_group"]) + + +def test_render_graph_raises_on_table_without_region_key(): + sdata = _sdata_with_graph_on_shapes() + sdata["table"].uns["spatialdata_attrs"]["region_key"] = None + with pytest.raises(ValueError, match="has no `region_key`"): + sdata.pl.render_graph("my_shapes", table_name="table") + + +def test_render_graph_obsp_key_populates_edge_values_from_matrix(): + """Edge color array must equal the obsp matrix entries for the rendered edges.""" + sdata = _sdata_with_weighted_graph() + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", color=None, obsp_key="spatial_distances", cmap="viridis") + .pl.show(ax=ax) + ) + lc = next(c for c in ax.collections if isinstance(c, LineCollection)) + distances = sdata["table"].obsp["spatial_distances"] + rows, cols = triu(distances, k=1).nonzero() + np.testing.assert_allclose(np.asarray(lc.get_array()), distances[rows, cols].A1) + plt.close(fig) + + +def test_render_graph_color_by_obs_categorical_with_palette_dict(): + """Same-category edges get the palette colour; cross-category edges get na_color.""" + sdata = _sdata_with_graph_on_shapes() + palette = {"tumor": "#ff0000", "immune": "#00ff00", "stroma": "#0000ff"} + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", color="cell_type", palette=palette, na_color="#888888") + .pl.show(ax=ax) + ) + lc = next(c for c in ax.collections if isinstance(c, LineCollection)) + allowed = {tuple(matplotlib.colors.to_rgba(v)) for v in palette.values()} + allowed.add(tuple(matplotlib.colors.to_rgba("#888888"))) + for c in lc.get_colors(): + assert tuple(c) in allowed + plt.close(fig) + + +def test_render_graph_color_by_obs_continuous_uses_endpoint_mean(): + sdata = _sdata_with_graph_on_shapes() + rng = get_standard_RNG() + scores = rng.uniform(0.0, 1.0, size=sdata["table"].n_obs) + sdata["table"].obs["score"] = scores + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", color="score", cmap="magma") + .pl.show(ax=ax) + ) + lc = next(c for c in ax.collections if isinstance(c, LineCollection)) + rows, cols = triu(sdata["table"].obsp["spatial_connectivities"], k=1).nonzero() + np.testing.assert_allclose(np.asarray(lc.get_array()), 0.5 * (scores[rows] + scores[cols])) + plt.close(fig) + + +def test_render_graph_draws_colorbar_for_continuous_coloring(): + sdata = _sdata_with_weighted_graph() + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", color=None, obsp_key="spatial_distances", cmap="viridis") + .pl.show(ax=ax) + ) + cbars = [c for c in fig.get_children() if isinstance(c, matplotlib.axes.Axes) and c is not ax] + assert cbars + plt.close(fig) + + +def test_render_graph_colorbar_can_be_disabled(): + sdata = _sdata_with_weighted_graph() + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", color=None, obsp_key="spatial_distances", colorbar=False) + .pl.show(ax=ax) + ) + cbars = [ + c + for c in fig.get_children() + if isinstance(c, matplotlib.axes.Axes) and c is not ax and c.get_ylim() != (0.0, 1.0) + ] + assert not cbars + plt.close(fig) + + +def test_render_graph_edge_width_by_weight_produces_normalised_array(): + sdata = _sdata_with_weighted_graph() + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", edge_width="weight", weight_key="spatial_distances") + .pl.show(ax=ax) + ) + lc = next(c for c in ax.collections if isinstance(c, LineCollection)) + widths = lc.get_linewidths() + assert len(widths) > 1 + assert 0.5 - 1e-6 <= float(np.min(widths)) < float(np.max(widths)) <= 3.0 + 1e-6 + plt.close(fig) + + +@pytest.mark.parametrize("include_self_loops", [True, False]) +def test_render_graph_include_self_loops(include_self_loops): + sdata = _sdata_with_graph_on_shapes() + adj = sdata["table"].obsp["spatial_connectivities"].tolil() + for i in range(sdata["table"].n_obs): + adj[i, i] = 1.0 + sdata["table"].obsp["spatial_connectivities"] = adj.tocsr() + + fig, ax = plt.subplots() + ( + sdata.pl.render_shapes("my_shapes") + .pl.render_graph("my_shapes", table_name="table", include_self_loops=include_self_loops) + .pl.show(ax=ax) + ) + has_circles = any(isinstance(c, CircleCollection) for c in ax.collections) + assert has_circles is include_self_loops + plt.close(fig)