From 308df0022b61ad69add846e87f4182feabc56d7d Mon Sep 17 00:00:00 2001 From: Philipp A Date: Mon, 9 Oct 2023 13:59:52 +0200 Subject: [PATCH] Backport PR #2571: Fix scatter palette name --- scanpy/plotting/_anndata.py | 8 +++----- scanpy/plotting/_utils.py | 10 ++++++---- .../expected.png | Bin 0 -> 18150 bytes scanpy/tests/test_plotting.py | 15 ++++++++++++--- 4 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 scanpy/tests/_images/scatter_HES_percent_mito_bulk_labels/expected.png diff --git a/scanpy/plotting/_anndata.py b/scanpy/plotting/_anndata.py index a904a0778..9c31fc735 100755 --- a/scanpy/plotting/_anndata.py +++ b/scanpy/plotting/_anndata.py @@ -271,15 +271,14 @@ def _scatter_obs( palette_was_none = False if palette is None: palette_was_none = True - if isinstance(palette, cabc.Sequence): + if isinstance(palette, cabc.Sequence) and not isinstance(palette, str): if not is_color_like(palette[0]): palettes = palette else: palettes = [palette] else: palettes = [palette for _ in range(len(keys))] - for i, palette in enumerate(palettes): - palettes[i] = _utils.default_palette(palette) + palettes = [_utils.default_palette(palette) for palette in palettes] if basis is not None: component_name = ( @@ -372,8 +371,7 @@ def add_centroid(centroids, name, Y, mask): centroids[name] = Y_mask[i] # loop over all categorical annotation and plot it - for i, ikey in enumerate(categoricals): - palette = palettes[i] + for ikey, palette in zip(categoricals, palettes): key = keys[ikey] _utils.add_colors_for_categorical_sample_annotation( adata, key, palette, force_update_colors=not palette_was_none diff --git a/scanpy/plotting/_utils.py b/scanpy/plotting/_utils.py index 0a6fa70d8..76639a81f 100644 --- a/scanpy/plotting/_utils.py +++ b/scanpy/plotting/_utils.py @@ -1,7 +1,7 @@ +from __future__ import annotations + import warnings import collections.abc as cabc -from abc import ABC -from functools import lru_cache from typing import Union, List, Sequence, Tuple, Collection, Optional, Callable, Literal import anndata @@ -315,10 +315,12 @@ def savefig_or_show( pl.close() # clear figure -def default_palette(palette: Union[Sequence[str], Cycler, None] = None) -> Cycler: +def default_palette( + palette: Union[str, Sequence[str], Cycler, None] = None +) -> str | Cycler: if palette is None: return rcParams['axes.prop_cycle'] - elif not isinstance(palette, Cycler): + elif not isinstance(palette, (str, Cycler)): return cycler(color=palette) else: return palette diff --git a/scanpy/tests/_images/scatter_HES_percent_mito_bulk_labels/expected.png b/scanpy/tests/_images/scatter_HES_percent_mito_bulk_labels/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..0ddd02eb907362ca6d4b20a92992491908e7b38a GIT binary patch literal 18150 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 literal 0 HcmV?d00001 diff --git a/scanpy/tests/test_plotting.py b/scanpy/tests/test_plotting.py index a51b37860..cd1919b8c 100644 --- a/scanpy/tests/test_plotting.py +++ b/scanpy/tests/test_plotting.py @@ -1233,12 +1233,21 @@ def test_scatter_specify_layer_and_raw(): sc.pl.umap(pbmc, color="HES4", use_raw=True, layer="layer") -def test_scatter_no_basis_per_obs(image_comparer): +@pytest.mark.parametrize("color", ["n_genes", "bulk_labels"]) +def test_scatter_no_basis_per_obs(image_comparer, color): """Test scatterplot of per-obs points with no basis""" save_and_compare_images = image_comparer(ROOT, FIGS, tol=15) pbmc = pbmc68k_reduced() - sc.pl.scatter(pbmc, x="HES4", y="percent_mito", color="n_genes", use_raw=False) - save_and_compare_images("scatter_HES_percent_mito_n_genes") + sc.pl.scatter( + pbmc, + x="HES4", + y="percent_mito", + color=color, + use_raw=False, + # palette only applies to categorical, i.e. color=='bulk_labels' + palette='Set2', + ) + save_and_compare_images(f"scatter_HES_percent_mito_{color}") def test_scatter_no_basis_per_var(image_comparer):