Mislocation of colorbar legend by `sc.pl.scatter`
Nobody has claimed this yet.
- 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,
Interestingly, sc.pl.embedding returns a correct figure.
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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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