scverse / scverse/spatialdata-plot

Additive RGB color blending for render_shapes / render_labels (and render_points)

Ouverte
#677 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Python
Étoiles
86
Forks
21
Merge moyen
14 h 50 min
PR mergées (30 j)
3

Description

Motivation

Spun out from #321 (the thread there mixes two unrelated asks — this issue is the second one, originally raised by @brainfo).

`render_images` already supports multi-channel additive compositing: you pass several channels with per-channel colormaps and they blend into a single RGB image, mirroring napari / ImageJ / FIJI for fluorescence microscopy. The same idiom is useful for sequencing-based spatial data, where a user wants to visualize co-expression of 2–3 genes per cell/spot/region on a single axis — red for gene A, green for gene B, blue for gene C, additively blended so co-expressing cells appear yellow/cyan/white.

Today this requires manual post-processing (the user in #321 mentions doing it in Illustrator).

Proposed API

Mirror the existing `render_images` multi-channel convention by letting `color` accept a list of obs/var columns on `render_shapes`, `render_labels`, and `render_points`:

```python
sdata.pl.render_shapes(
color=["Sox2", "Pax6", "Tbr2"],
palette=["red", "green", "blue"], # one color per channel
channels_as_legend=True,
).pl.show()

sdata.pl.render_labels(
color=["Sox2", "Pax6"],
palette=["red", "green"],
).pl.show()

sdata.pl.render_points(
color=["Sox2", "Pax6"],
).pl.show()
```

Output: a single axis (no multi-panel grid). Each shape / label / point gets one composited color derived from its per-column values blended via per-channel colormaps, identical in spirit to the additive multi-channel path already in `render_images`.

Why this is feasible

  • The additive-blending machinery already exists in `pl/render.py` for the multi-channel image path (see `render_images` branches 2A/2B/2C). The same per-channel cmap + sum + clip logic applies.
  • Single-axis output sidesteps the hierarchy-of-axes complexity that made multi-panel `color=[...]` (the other ask from #321) undesirable.
  • `channels_as_legend` already exists for `render_images`; can extend.

Scope

  • In scope: 2–3-column color lists on `render_shapes`, `render_labels`, `render_points`. Per-channel `cmap` or `palette`. Additive blend on a single axis.
  • Out of scope (defer or decline):
    • Multi-panel grids (`sc.pl.umap`-style) — already declined in #321.
    • Arbitrary blend modes beyond additive — start with the existing `render_images` semantics.
    • PCA-based or learned color reductions for >3 channels.

Edge cases to design for

  • Length mismatch between `color` list and `palette` list.
  • Mixing categorical and continuous columns in the same `color` list (probably reject with a clear error).
  • NaN handling per column (skip vs zero vs error — likely error, matching the recent `render_images` NaN rejection).
  • Per-column `norm` / `vmin` / `vmax` — accept a list, parallel to the per-channel `norm` already supported on `render_images`.
  • `groups` semantics when `color` is a list — likely ignored with a warning.

Relation to #321

#321 conflates two asks under "plotting multiple genes":

  1. Multi-panel grid for several genes — declined; possibly hosted in a future Squidpy 2.0 wrapper.
  2. Single-axis additive blend for co-expression visualization — this issue.

The documentation sub-tasks in #321 (`save`, `ncols` on `pl.show()`) are already resolved.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans pl/render.py en lisant les branches multicanal existantes de render_images 2A/2B/2C, puis suivez render_shapes, render_labels et render_points. Le travail est terminé lorsque 2–3 colonnes continues sont prises en charge comme couleurs par canal sur un axe avec un mélange additif, tout en définissant les comportements associés à la longueur de palette, aux types mixtes, à NaN, à la normalisation et à groups indiqués.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
data-visualization
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.