scverse / scverse/spatialdata-plot
Additive RGB color blending for render_shapes / render_labels (and render_points)
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 86
- Fork
- 21
- Merge trung bình
- 14 giờ 50 phút
- Pull request đã merge (30 ngày)
- 3
Mô tả
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":
- Multi-panel grid for several genes — declined; possibly hosted in a future Squidpy 2.0 wrapper.
- Single-axis additive blend for co-expression visualization — this issue.
The documentation sub-tasks in #321 (`save`, `ncols` on `pl.show()`) are already resolved.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu trong pl/render.py bằng cách đọc các nhánh đa kênh hiện có của render_images 2A/2B/2C, sau đó lần theo render_shapes, render_labels và render_points. Hoàn thành có nghĩa là hỗ trợ 2–3 cột liên tục dưới dạng màu theo từng kênh trên một trục với phép trộn cộng, đồng thời xác định hành vi cho độ dài palette, kiểu hỗn hợp, NaN, chuẩn hóa và groups được liệt kê.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- data-visualization
- Loại issue
- Tính năng
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100