Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning][].

### Fixed

- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap
- Fixed `fill_alpha` ignoring `alpha` channel from custom cmap

## [0.2.0] - 2024-03-24

Expand Down
110 changes: 80 additions & 30 deletions src/spatialdata_plot/pl/basic.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -150,10 +150,10 @@ def _copy(
def render_shapes(
self,
elements: list[str] | str | None = None,
color: str | None = None,
color: list[str | None] | str | None = None,
fill_alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
outline: bool = False,
outline_width: float | int = 1.5,
Expand All@@ -173,17 +173,29 @@ def render_shapes(
elements : list[str] | str | None, optional
The name(s) of the shapes element(s) to render. If `None`, all shapes
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
fill_alpha : float | int, default 1.0
Alpha value for the fill of shapes.
groups : list[str] | str | None, optional
Alpha value for the fill of shapes. If the alpha channel is present in a cmap passed by the
user, this value will multiply the value present in the cmap.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -274,8 +286,8 @@ def render_points(
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
alpha: float | int = 1.0,
groups: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
na_color: ColorLike | None = "lightgrey",
cmap: Colormap | str | None = None,
norm: None | Normalize = None,
Expand All@@ -291,17 +303,28 @@ def render_points(
elements : list[str] | str | None, optional
The name(s) of the points element(s) to render. If `None`, all points
elements in the `SpatialData` object will be used.
color : Colorlike | str | None, optional
Can either be a color-like or a key in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables.
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it can be stuff in adata.obs, as points are not annotated by tables

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also below, is this correct? I don't think so,I think it was copy pasted?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hehe points now can be annotated by tables and I agree on tests, still have to write them. In general also a lot of the notebooks have plots that have no equivalent tests here so before a lot of them were not properly showing either. However, for release it was pushed. The logic of this library is quite complicated with some parameters with the same name are used in different ways that it took me quite some time so at the moment I did the testing by checking whether all the notebook plots now display correctly.

can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
alpha : float | int, default 1.0
Alpha value for the points.
groups : list[str] | str | None, optional
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
palette : list[str] | str | None, optional
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
na_color : str | list[float] | None, default "lightgrey"
Color to be used for NAs values, if present. Can either be a named color
("red"), a hex representation ("#000000ff") or a list of floats that
Expand DownExpand Up@@ -374,7 +397,7 @@ def render_images(
cmap: list[Colormap] | Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
palette: list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
alpha: float | int = 1.0,
quantiles_for_norm: tuple[float | None, float | None] | None = None,
scale: list[str] | str | None = None,
Expand All@@ -400,6 +423,11 @@ def render_images(
Applies to all channels if set.
na_color : ColorLike | None, default (0.0, 0.0, 0.0, 0.0)
Color to be used for NA values. Accepts color-like values (string, hex, RGB(A)).
palette : list[list[str | None]] | list[str | None] | str | None
Palette to color images. In the case of a list of
lists means that there is one list per element to be plotted in the list and this list contains the string
indicating the palette to be used. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements).
alpha : float | int, default 1.0
Alpha value for the images. Must be a numeric between 0 and 1.
quantiles_for_norm : tuple[float | None, float | None] | None, optional
Expand DownExpand Up@@ -476,10 +504,10 @@ def render_labels(
self,
elements: list[str] | str | None = None,
color: list[str | None] | str | None = None,
groups: list[list[str | None]] | list[str] | str | None = None,
groups: list[list[str | None]] | list[str | None] | str | None = None,
contour_px: int = 3,
outline: bool = False,
palette: list[list[str | None]] | list[str] | str | None = None,
palette: list[list[str | None]] | list[str | None] | str | None = None,
cmap: Colormap | str | None = None,
norm: Normalize | None = None,
na_color: ColorLike | None = (0.0, 0.0, 0.0, 0.0),
Expand All@@ -497,19 +525,31 @@ def render_labels(
elements : list[str] | str | None, optional
The name(s) of the label element(s) to render. If `None`, all label
elements in the `SpatialData` object will be used.
color : str | None, optional
Key for annotations in :attr:`anndata.AnnData.obs` or variables/genes.
groups : list[str] | str | None, optional
color : list[str | None] | str | None
Can either be string(s) representing a color-like or key(s) in :attr:`sdata.table.obs`. The latter
can be used to color by categorical or continuous variables. If provided as a list, the length of the list
must match the number of elements that will be plotted. Otherwise, if possible the color will be broadcasted
to all elements. For this, the table in which the color key is found must
annotate the respective element (region must be set to the specific element). If the color column is found
in multiple locations, please provide the table_name to be used for the element.
groups : list[list[str | None]] | list[str | None] | str | None
When using `color` and the key represents discrete labels, `groups`
can be used to show only a subset of them. Other values are set to NA.
can be used to show only a subset of them. Other values are set to NA. In general the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
discrete labels to be visualized. If not provided as list of lists, broadcasting behaviour is attempted
(use the same values for all elements).
palette : list[list[str | None]] | list[str | None] | str | None
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups. Similarly to groups, in the case of a list of
lists means that there is one list per element to be plotted in the list and this list can contain multiple
palettes (one per group) to be visualized. If not provided as list of lists, broadcasting behaviour is
attempted (use the same values for all elements). If groups is provided but not palette, palette is set to
default "lightgray".
contour_px : int, default 3
Draw contour of specified width for each segment. If `None`, fills
entire segment, see :func:`skimage.morphology.erosion`.
outline : bool, default False
Whether to plot boundaries around segmentation masks.
palette : list[str] | str | None, optional
Palette for discrete annotations. List of valid color names that should be
used for the categories. Must match the number of groups.
cmap : Colormap | str | None, optional
Colormap for continuous annotations, see :class:`matplotlib.colors.Colormap`.
norm : Normalize | None, optional
Expand All@@ -529,6 +569,10 @@ def render_labels(
3) "full": render the full image without rasterization. In the case of a multiscale image, the scale
with the highest resolution is selected. This can lead to long computing times for large images!
4) List that is matched to the list of elements (can contain `None`, scale names or "full").
table_name:
Name of the table(s) containing the color(s) columns. If one name is given than the table is used for each
spatial element to be plotted if the table annotates it. If multiple names are given in a list than the
length must be equal to the number of spatial elements being plotted.
kwargs
Additional arguments to be passed to cmap and norm.

Expand DownExpand Up@@ -623,6 +667,12 @@ def show(
Works only if there is one image in the SpatialData object.
ncols :
Number of columns in the figure. Default is 4.
return_ax :
Whether to return the axes object created. False by default.
colorbar :
Whether to plot the colorbar. True by default.
title :
The title of the plot. If not provided the plot will have the name of the coordinate system as title.

Returns
-------
Expand Down
21 changes: 10 additions & 11 deletions src/spatialdata_plot/pl/render.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -677,17 +677,6 @@ def _render_labels(
na_color=render_params.cmap_params.na_color,
)

_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)

# Then overlay the contour
labels_contour = _map_color_seg(
seg=label.values,
Expand All@@ -708,6 +697,16 @@ def _render_labels(
alpha=render_params.outline_alpha,
origin="lower",
)
_cax = ax.imshow(
labels_infill,
rasterized=True,
cmap=None if categorical else render_params.cmap_params.cmap,
norm=None if categorical else render_params.cmap_params.norm,
alpha=render_params.fill_alpha,
origin="lower",
)
_cax.set_transform(trans_data)
cax = ax.add_image(_cax)
else:
# Default: no alpha, contour = infill
label = _map_color_seg(
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata_plot/pl/render_params.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ class ShapesRenderParams:
col_for_color: str | None = None
groups: str | list[list[str | None]] | list[str | None] | None = None
contour_px: int | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
outline_alpha: float = 1.0
fill_alpha: float = 0.3
scale: float = 1.0
Expand DownExpand Up@@ -106,7 +106,7 @@ class ImageRenderParams:
cmap_params: list[CmapParams] | CmapParams
elements: str | Sequence[str] | None = None
channel: list[str] | list[int] | int | str | None = None
palette: ListedColormap | list[str | None] | None = None
palette: ListedColormap | list[list[str | None]] | list[str | None] | None = None
alpha: float = 1.0
quantiles_for_norm: tuple[float | None, float | None] = (None, None)
scale: str | list[str] | None = None
Expand Down
Loading