Returning cluster assignments as str conflicts with matplotlib color sequences
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 2.6k
- Forks
- 779
- Avg merge
- 1d 4h
- Merged PRs (30d)
- 27
Description
Currently, sc.tl.louvain etc return cluster assignments as a Categorical with dtype str resulting in incompatibility with matplotlib color sequences. For example, the following code raises a ValueError:
import numpy as np
import scanpy as sc
import matplotlib.pyplot as plt
adata = sc.AnnData(np.random.normal(size=(100,2)))
sc.pp.neighbors(adata)
sc.tl.louvain(adata)
plt.scatter(adata.X[:,0], adata.X[:,1], c=adata.obs['louvain'])
The error is: ValueError: RGBA values should be within 0-1 range. Funnily enough, this used to work due to a bug in matplotlib that was fixed in https://github.com/matplotlib/matplotlib/pull/13913.
Note, the following code works as intended:
plt.scatter(adata.X[:,0], adata.X[:,1], c=adata.obs['louvain'].astype(int))
I would have submitted a PR changing this behavior had I not noticed that returning cluster assignments as str is explicitly checked here:
This brings up a larger design question in scanpy / anndata: Why are arrays of numerics routinely converted to strings representing numbers?
In https://github.com/theislab/anndata/issues/311 I found a case where converting arrays of numerics to strings creates a bug when assigning to AnnData obsm with DataFrames with a RangeIndex. In that case, I understand there's a desire to avoid ambiguity in positional vs label indexing, but that issue was solved in pandas with the .loc and .iloc conventions. Why not carry that forward?
In this case, why not just return cluster assignments as arrays of numerics as is done in sklearn.cluster?
I think following these conventions will make both tools much more accessible to the general Python data science community.
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
Reproduce the documented scatter example first, then inspect the explicit string-dtype handling in scanpy/tools/_utils_clustering.py at the linked lines. Resolve the assignment representation consistently with the project’s clustering conventions; done means the matplotlib call no longer raises without requiring astype(int), while preserving expected AnnData behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- matplotlib, python
- Domain
- data-visualization, machine-learning
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100