plotly / plotly/plotly.py

Colorscales in templates are not valid list of lists, which breaks `plotly.colors.sample_colorscale`

Ouverte
#4,808 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug P3
Langage dominant
Python
Étoiles
18.8k
Forks
2.8k
Merge moyen
16 h 26 min
PR mergées (30 j)
21

Description

Hello! I have something which is maybe a bug. It's certainly how I expected plotly.py to work, although maybe it's just a known limitation of how layout templates work.

Plotly comes with various colorscales built in, which work great:

import plotly
rainbow = plotly.colors.get_colorscale("rainbow")
# gives
[[0.0, 'rgb(150,0,90)'],
 [0.125, 'rgb(0,0,200)'],
 [0.25, 'rgb(0,25,255)'],
 [0.375, 'rgb(0,152,255)'],
 [0.5, 'rgb(44,255,150)'],
 [0.625, 'rgb(151,255,0)'],
 [0.75, 'rgb(255,234,0)'],
 [0.875, 'rgb(255,111,0)'],
 [1.0, 'rgb(255,0,0)']]

This is a list of lists and works as expected: plotly.colors.validate_colorscale(rainbow) passes.

Now I'd like to extract the colorscale from a template. This where things don't work as expected:

diverging  = plotly.io.templates["plotly"].layout.colorscale.diverging
# gives
((0, '#8e0152'),
 (0.1, '#c51b7d'),
 (0.2, '#de77ae'),
 (0.3, '#f1b6da'),
 (0.4, '#fde0ef'),
 (0.5, '#f7f7f7'),
 (0.6, '#e6f5d0'),
 (0.7, '#b8e186'),
 (0.8, '#7fbc41'),
 (0.9, '#4d9221'),
 (1, '#276419'))

This is a tuple of tuples and does not pass plotly.colors.validate_colorscale(diverging), which raises:

_plotly_utils.exceptions.PlotlyError: A valid colorscale must be a list.

It's easy to convert this into a valid colorscale as diverging = [list(x) for x in diverging] but it seems strange that this is necessary.

Should the colorscale coming from a template be a list of lists already? Or should validate_colorscale accept tuple of tuples as valid? The real reason this matters is because plotly.colors.sample_colorscale runs validate_colorscale under the hood, which raises an error and means that sample_colorscale doesn't work.


Side note

AFAICT there's no way register a new colorscale in plotly other than through a template. plotly.colors.named_colorscales comes from _plotly_utils.basevalidators.ColorscaleValidator.named_colorscales, but that's private and has no method for adding a new scale.

ColorscaleValidator("", "").validate_coerce(diverging) works to do the tuple of tuples to list of lists conversion, but again it's not public, and it seems weird that it would be necessary to run any coercion on a colorscale coming from a template anyway.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par plotly.colors.validate_colorscale et sample_colorscale, puis suivez la manière dont plotly.io.templates expose les valeurs de layout.colorscale via ColorscaleValidator. Comparez le résultat intégré de type list-of-lists avec le résultat de type tuple-of-tuples du template et le chemin de coercition existant ; le travail est terminé lorsque les échelles de couleurs des templates peuvent être transmises à sample_colorscale sans l’erreur de validation signalée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
data-visualization
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
42/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.