scverse / scverse/scanpy

Mislocation of colorbar legend by `sc.pl.scatter`

Open
#3,963 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Area - Plotting 🌺
Dominant language
Python
Stars
2.6k
Forks
779
Avg merge
1d 4h
Merged PRs (30d)
27

Description

Please make sure these conditions are met
  • I have checked that this issue has not already been reported.
  • I have confirmed this bug exists on the latest version of scanpy.
  • (optional) I have confirmed this bug exists on the main branch of scanpy.
What happened?

When plotting in given ax, for continuous variable, sc.pl.scatter seems mislocated the colorbar by default settings. It did not stick to the ax it should be, and covered another ax by its side. Just like follow,
Image

Interestingly, sc.pl.embedding returns a correct figure.

Image

I noticed there was an issue about sc.pl.scatter colorbar legend (#1821). I also tried to remove mislocated colorbar by using legend_loc = "none" param. But it did not changed anything.

Minimal code sample
# /// script
# requires-python = ">=3.12"
# dependencies = [
#   "scanpy@git+https://github.com/scverse/scanpy.git@main",
# ]
# ///
#
# This script automatically imports the development branch of scanpy to check for issues

import scanpy as sc
import scFates as scf

## ====Making mislocated colorbar====
fig, axs = plt.subplots(1,2,figsize=(10,4))
fig.subplots_adjust(wspace = 0.3)
sc.pl.scatter(caf_hvg, basis="diffmap",color_map="RdYlBu_r", 
               color="t", 
               ax=axs[0], show=False,
               # legend_loc = "none", # Adding this param neither changed colorbar location nor removed colorbar
               )
scf.pl.trajectory(..., 
                  ax=axs[1])

## ====Correctly located colorbar====
fig, axs = plt.subplots(1,2,figsize=(10,4))
fig.subplots_adjust(wspace = 0.3)
sc.pl.embedding(caf_hvg, basis="diffmap", dimensions=[1,2],color_map="RdYlBu_r", 
              color="t",
              ax=axs[0], show=False)
scf.pl.trajectory(..., 
                  ax=axs[1])
Error output

Versions
Package | Version
-- | --
matplotlib | 3.10.8
pandas | 2.3.3
numpy | 2.3.5
scanpy | 1.12
seaborn | 0.13.2
scFates | 1.2.1
palantir | 1.4.3
anndata | 0.12.8

Python | 3.13.0 \| packaged by Anaconda, Inc. \| (main, Oct 7 2024, 21:29:38) [GCC 11.2.0]
OS | Linux-6.11.0-21-generic-x86_64-with-glibc2.39
CPU | 28 logical CPU cores, x86_64
GPU | ID: 0, Quadro K2000, Driver: 470.256.02, Memory: 1996 MiB
Updated | 2026-01-30 03:34

Dependency | Version
-- | --
scikit-learn | 1.8.0
python-dateutil | 2.9.0.post0
six | 1.17.0
cffi | 2.0.0
executing | 2.2.1
psutil | 7.2.2
wcwidth | 0.5.0
packaging | 25.0
jupyter_core | 5.9.1
elpigraph-python | 0.3.2
plotly | 6.5.2
texttable | 1.7.0
parso | 0.8.5
pycparser | 3.0 (3.00)
donfig | 0.8.1.post1
asttokens | 3.0.1
networkx | 3.6.1
prompt_toolkit | 3.0.52
joblib | 1.5.3
numba | 0.63.1
ipywidgets | 8.1.8
rpy2-rinterface | 3.6.3
threadpoolctl | 3.6.0
pyparsing | 3.3.2
pytz | 2025.2
traitlets | 5.14.3
zarr | 3.1.5
stack-data | 0.6.3
patsy | 1.0.2
tqdm | 4.67.1
jupyter_client | 8.8.0
session-info2 | 0.3
scipy | 1.17.0
statsmodels | 0.14.6
natsort | 8.4.0
legacy-api-wrap | 1.5
Jinja2 | 3.1.6
cycler | 0.12.1
kiwisolver | 1.4.9
llvmlite | 0.46.0
scikit-misc | 0.5.2
platformdirs | 4.5.1
h5py | 3.15.1
tornado | 6.5.4
typing_extensions | 4.15.0
comm | 0.2.3
pillow | 12.1.0
adjustText | 1.3.0
ipython | 9.9.0
pure_eval | 0.2.3
rpy2-robjects | 3.6.3
igraph | 1.0.0
pyzmq | 27.1.0
simpleppt | 1.1.4
decorator | 5.2.1
google-crc32c | 1.8.0
tzlocal | 5.3.1
debugpy | 1.8.19
shapely | 2.1.2
MarkupSafe | 3.0.3
setuptools | 80.10.1
numcodecs | 0.16.5
matplotlib-inline | 0.2.1
PyYAML | 6.0.3
jedi | 0.19.2
ipykernel | 7.1.0
Pygments | 2.19.2
fast-array-utils | 1.3.1

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at the sc.pl.scatter entry point and compare its continuous-color handling with sc.pl.embedding, using the supplied two-axis reproduction. Verify that the colorbar stays associated with the scatter axis and that legend_loc="none" behaves as documented; add or update coverage for this case if the existing tests expose the plotting behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
matplotlib, python
Domain
data-visualization
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.