Plotly: come definire i colori in una figura usando plotly.graph_objects e plotly.express?
Ci sono molte domande e risposte che toccano questo argomento in un modo o nell'altro. Con questo contributo vorrei mostrare chiaramente perché un approccio facile come marker = {'color' : 'red'}
funzionerà plotly.graph_objects (go)
, ma color='red'
non lo sarà, plotly.express (px)
sebbene il colore sia un attributo di entrambi px.Line
e px.Scatter
. E vorrei dimostrare perché è fantastico che non lo sia.
Quindi, se px
si suppone che sia il modo più semplice per creare una figura trama , allora perché qualcosa di così apparentemente ovvio come color='red'
restituire l'errore
ValueError: il valore di "color" non è il nome di una colonna in "data_frame".
Permettetemi di dimostrare applicando un set di dati di gapminder e mostrare un grafico a dispersione di Life expectancy
versus GDP per capita
per tutti (almeno la maggior parte ) paesi del mondo a partire dal 2007
. Una configurazione di base come di seguito produrrà la seguente trama
Figura 1, grafico utilizzando go
:

Il colore è impostato da un ciclo denominato plotly ma qui specificato utilizzando marker = {'color' : 'red'}
Figura 2, codice:
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()
Quindi proviamo questo con px
e supponiamo che color='red'
farebbe il trucco:
Codice 2, prova a un grafico a dispersione con un colore definito utilizzando 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',
)
Risultato:
ValueError: il valore di "color" non è il nome di una colonna in "data_frame". Previsto uno tra ["country", "continent", "year", "lifeExp", "pop", "gdpPercap", "iso_alpha", "iso_num"] ma ricevuto: rosso
Allora cosa sta succedendo qui?
Risposte
Innanzitutto, se è richiesta una spiegazione delle differenze più ampie tra go
e px
, dai un'occhiata qui e qui . E se non sono assolutamente necessarie spiegazioni, troverai uno snippet di codice completo alla fine della risposta che rivelerà molti dei poteri con i colori in plotly.
Parte 1: L'essenza:
Potrebbe non sembrare così in un primo momento, ma ci sono molto buone ragioni per cui color='red'
non funziona come ci si potrebbe aspettare utilizzando px
. Ma prima di tutto, se tutto ciò che vorresti fare è impostare manualmente un colore particolare per tutti i marker , puoi farlo usando .update_traces(marker=dict(color='red'))
grazie al metodo di concatenamento dei pitoni . Ma prima, diamo un'occhiata alle impostazioni sorde:
1.1 Plotly express i valori predefiniti
Figura 1, grafico a dispersione predefinito px utilizzando px.Scatter

Codice 1, grafico a dispersione predefinito px utilizzando 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")
Qui, come già accennato nella domanda, il colore è impostato come primo colore nella sequenza di trama predefinita disponibile tramite px.colors.qualitative.Plotly
:
['#636EFA', # the plotly blue you can see above
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
E sembra abbastanza buono. Ma cosa succede se vuoi cambiare le cose e anche aggiungere più informazioni allo stesso tempo?
1.2: Come sovrascrivere le impostazioni predefinite e fare esattamente quello che vuoi con i colori px:
Come abbiamo già accennato px.scatter
, l' color
attributo non assume un colore come red
come argomento. Piuttosto, puoi ad esempio utilizzare color='continent'
per distinguere facilmente tra diverse variabili in un set di dati. Ma c'è molto di più sui colori in px
:
La combinazione dei sei metodi seguenti ti consentirà di fare esattamente ciò che desideri con i colori utilizzando plotly express. Tieni presente che non devi nemmeno scegliere . Puoi utilizzare uno , alcuni o tutti i metodi seguenti contemporaneamente. E un particolare approccio utile si rivelerà come un combinatino di 1
e 3
. Ma ci arriveremo tra un po '. Questo è quello che devi sapere:
1. Cambia la sequenza di colori usata da px con:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. Assegna colori diversi a variabili diverse con l' color
argomento
color = 'continent'
3. personalizzare uno o più colori variabili con
color_discrete_map={"Asia": 'red'}
4. Raggruppa facilmente un sottoinsieme più ampio delle tue variabili usando la comprensione dei dettami ecolor_discrete_map
subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
5. Impostare l'opacità utilizzando rgba()
i codici colore.
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
6. Ignora tutte le impostazioni con:
.update_traces(marker=dict(color='red'))
Parte 2: i dettagli e le trame
Il seguente frammento produrrà la trama sottostante che mostra l'aspettativa di vita per tutti i continenti per diversi livelli di PIL. La dimensione degli indicatori rappresenta diversi livelli di popolazione per rendere le cose più interessanti sin dall'inizio.
Trama 2:

Codice 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',
)
Per illustrare la flessibilità dei metodi sopra, per prima cosa cambiamo solo la sequenza dei colori . Dato che per i principianti mostriamo solo una categoria e un colore, dovrai attendere i passaggi successivi per vedere gli effetti reali. Ma ora ecco la stessa trama color_discrete_sequence=px.colors.qualitative.Alphabet
come per il passaggio 1:
1. Modificare la sequenza di colori usata da px con
color_discrete_sequence=px.colors.qualitative.Alphabet

Ora, applichiamo i colori della Alphabet
sequenza di colori ai diversi continenti:
2. Assegna colori diversi a variabili diverse con l' color
argomento
color = 'continent'

Se, come me, pensi che questa particolare sequenza di colori sia piacevole alla vista ma forse un po 'indistinguibile, puoi assegnare un colore a tua scelta a uno o più continenti come questo:
3. personalizzare uno o più colori variabili con
color_discrete_map={"Asia": 'red'}

E questo è davvero fantastico: ora puoi cambiare la sequenza e scegliere qualsiasi colore desideri per variabili particolarmente interessanti. Ma il metodo sopra può diventare un po 'noioso se desideri assegnare un colore particolare a un sottoinsieme più grande. Quindi ecco come puoi farlo anche con una comprensione dettata :
4. Assegna i colori a un gruppo usando una comprensione dettata ecolor_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. Impostare l'opacità utilizzando rgba()
i codici colore.
Ora facciamo un passo indietro. Se pensi che sia red
adatto all'Asia, ma forse è un po 'troppo forte, puoi regolare l'opacità usando un rgba
colore come 'rgba(255,0,0,0.4)'
per ottenere questo:

Codice completo per l'ultima trama:
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)'}
)
E se pensi che ormai stiamo diventando un po 'troppo complicati, puoi sovrascrivere di nuovo tutte le impostazioni in questo modo:
6. Ignora tutte le impostazioni con:
.update_traces(marker=dict(color='red'))

E questo ci riporta al punto di partenza. Spero che lo troverai utile!
Snippet di codice completo con tutte le opzioni disponibili:
# 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'))