Plotly: Comment définir les couleurs d'une figure en utilisant plotly.graph_objects et plotly.express?
Il existe de nombreuses questions et réponses qui touchent d'une manière ou d'une autre à ce sujet. Avec cette contribution, je voudrais montrer clairement pourquoi une approche simple telle que marker = {'color' : 'red'}
cela fonctionnera plotly.graph_objects (go)
, mais color='red'
pas pour plotly.express (px)
bien que la couleur soit un attribut des deux px.Line
et px.Scatter
. Et j'aimerais montrer pourquoi c'est génial que ce ne soit pas le cas.
Donc, si px
c'est censé être le moyen le plus simple de faire une figure intrigue , alors pourquoi quelque chose d'aussi apparemment évident que de color='red'
renvoyer l'erreur
ValueError: La valeur de 'color' n'est pas le nom d'une colonne dans 'data_frame'.
Permettez-moi de faire une démonstration en appliquant un ensemble de données gapminder et de montrer un nuage de points de Life expectancy
versus GDP per capita
pour tous (au moins la plupart ) pays du monde à partir de 2007
. Une configuration de base comme ci-dessous produira le tracé suivant
Figure 1, tracer en utilisant go
:
La couleur est définie par un cycle nommé tracé mais est ici spécifiée à l'aide de marker = {'color' : 'red'}
Figure 2, code:
import plotly.graph_objects as go
df = px.data.gapminder()
df=df.query("year==2007")
fig = go.Figure()
fig.add_traces(go.Scatter(x=df['gdpPercap'], y=df["lifeExp"],
mode = 'markers',
marker = {'color' : 'red'}
))
fig.show()
Alors essayons ceci avec px
, et supposons que color='red'
cela ferait l'affaire:
Code 2, essayez un nuage de points avec une couleur définie en utilisant px
:
# imports
import plotly.express as px
import pandas as pd
# dataframe
df = px.data.gapminder()
df=df.query("year==2007")
# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
color = 'red',
)
Résultat:
ValueError: La valeur de 'color' n'est pas le nom d'une colonne dans 'data_frame'. Attendu l'un des ['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] mais reçu: rouge
Alors qu'est-ce qui se passe ici?
Réponses
Premièrement, si une explication des différences plus larges entre go
et px
est nécessaire, veuillez jeter un œil ici et ici . Et si aucune explication n'est nécessaire, vous trouverez un extrait de code complet à la toute fin de la réponse qui révélera de nombreux pouvoirs avec des couleurs dans plotly.express
Partie 1: L'essence:
Cela peut ne pas sembler le cas au début, mais il y a de très bonnes raisons pour lesquelles cela color='red'
ne fonctionne pas comme vous pouvez vous y attendre px
. Mais tout d'abord, si tout ce que vous voulez faire est de définir manuellement une couleur particulière pour tous les marqueurs que vous pouvez le faire en utilisant .update_traces(marker=dict(color='red'))
grâce à pythons méthode enchaînant . Mais d'abord, regardons les paramètres sourds:
1.1 Plotly express par défaut
Figure 1, nuage de points par défaut px utilisant px.Scatter
Code 1, nuage de points par défaut px utilisant px.Scatter
# imports
import plotly.express as px
import pandas as pd
# dataframe
df = px.data.gapminder()
df=df.query("year==2007")
# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp")
Ici, comme déjà mentionné dans la question, la couleur est définie comme la première couleur dans la séquence de tracé par défaut disponible via px.colors.qualitative.Plotly
:
['#636EFA', # the plotly blue you can see above
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
Et ça a l'air plutôt bien. Mais que faire si vous voulez changer les choses et même ajouter plus d'informations en même temps?
1.2: Comment remplacer les valeurs par défaut et faire exactement ce que vous voulez avec les couleurs px:
Comme nous l'avons déjà mentionné px.scatter
, l' color
attribut ne prend pas une couleur comme red
un argument. Au contraire, vous pouvez par exemple utiliser color='continent'
pour distinguer facilement les différentes variables d'un ensemble de données. Mais il y a tellement plus de couleurs dans px
:
La combinaison des six méthodes suivantes vous permettra de faire exactement ce que vous voulez avec les couleurs en utilisant plotly express. Gardez à l'esprit que vous n'avez même pas à choisir . Vous pouvez utiliser une , certaines ou toutes les méthodes ci-dessous en même temps. Et une approche particulièrement utile se révélera comme une combinatino de 1
et 3
. Mais nous y reviendrons dans un instant. Voici ce que vous devez savoir:
1. Modifiez la séquence de couleurs utilisée par px avec:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. Attribuez différentes couleurs à différentes variables avec l' color
argument
color = 'continent'
3. personnalisez une ou plusieurs couleurs variables avec
color_discrete_map={"Asia": 'red'}
4. Regroupez facilement un plus grand sous-ensemble de vos variables en utilisant la compréhension de dictée etcolor_discrete_map
subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
5. Définissez l'opacité à l'aide de rgba()
codes de couleur.
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
6. Remplacez tous les paramètres par:
.update_traces(marker=dict(color='red'))
Partie 2: Les détails et les tracés
L'extrait suivant produira le graphique ci-dessous qui montre l'espérance de vie pour tous les continents pour différents niveaux de PIB. La taille des marqueurs représente différents niveaux de population pour rendre les choses plus intéressantes dès le départ.
Parcelle 2:
Code 2:
import plotly.express as px
import pandas as pd
# dataframe, input
df = px.data.gapminder()
df=df.query("year==2007")
px.scatter(df, x="gdpPercap", y="lifeExp",
color = 'continent',
size='pop',
)
Pour illustrer la flexibilité des méthodes ci-dessus, modifions d' abord simplement la séquence de couleurs . Étant donné que pour commencer, nous ne montrons qu'une seule catégorie et une seule couleur, vous devrez attendre les étapes suivantes pour voir les effets réels. Mais voici le même complot maintenant avec l' color_discrete_sequence=px.colors.qualitative.Alphabet
étape 1:
1. Modifiez la séquence de couleurs utilisée par px avec
color_discrete_sequence=px.colors.qualitative.Alphabet
Maintenant, appliquons les couleurs de la Alphabet
séquence de couleurs aux différents continents:
2. Attribuez différentes couleurs à différentes variables avec l' color
argument
color = 'continent'
Si, comme moi, vous pensez que cette séquence de couleurs particulière est facile à regarder mais peut-être un peu impossible à distinguer, vous pouvez attribuer une couleur de votre choix à un ou plusieurs continents comme celui-ci:
3. personnalisez une ou plusieurs couleurs variables avec
color_discrete_map={"Asia": 'red'}
Et c'est assez génial: vous pouvez maintenant changer la séquence et choisir la couleur de votre choix pour des variables particulièrement intéressantes. Mais la méthode ci-dessus peut devenir un peu fastidieuse si vous souhaitez attribuer une couleur particulière à un sous-ensemble plus grand. Alors, voici comment vous pouvez le faire aussi avec une compréhension de dict :
4. Attribuez des couleurs à un groupe en utilisant une compréhension de dict etcolor_discrete_map
# imports
import plotly.express as px
import pandas as pd
# dataframe
df = px.data.gapminder()
df=df.query("year==2007")
subset = {"Asia", "Europe", "Oceania"}
group_color = {i: 'red' for i in subset}
# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
size='pop',
color='continent',
color_discrete_sequence=px.colors.qualitative.Alphabet,
color_discrete_map=group_color
)
5. Définissez l'opacité à l'aide de rgba()
codes de couleur.
Maintenant, prenons un peu de recul. Si vous pensez que cela red
convient parfaitement à l'Asie, mais que c'est peut-être un peu trop fort, vous pouvez ajuster l'opacité en utilisant une rgba
couleur comme 'rgba(255,0,0,0.4)'
celle-ci:
Code complet du dernier tracé:
import plotly.express as px
import pandas as pd
# dataframe, input
df = px.data.gapminder()
df=df.query("year==2007")
px.scatter(df, x="gdpPercap", y="lifeExp",
color_discrete_sequence=px.colors.qualitative.Alphabet,
color = 'continent',
size='pop',
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
)
Et si vous pensez que nous devenons un peu trop compliqués maintenant, vous pouvez à nouveau remplacer tous les paramètres comme celui-ci:
6. Remplacez tous les paramètres par:
.update_traces(marker=dict(color='red'))
Et cela nous ramène à notre point de départ. J'espère que vous trouverez cela utile!
Extrait de code complet avec toutes les options disponibles:
# imports
import plotly.express as px
import pandas as pd
# dataframe
df = px.data.gapminder()
df=df.query("year==2007")
subset = {"Asia", "Europe", "Oceania"}
group_color = {i: 'red' for i in subset}
# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
size='pop',
color='continent',
color_discrete_sequence=px.colors.qualitative.Alphabet,
#color_discrete_map=group_color
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
)#.update_traces(marker=dict(color='red'))