Plotly: come definire i colori in una figura usando plotly.graph_objects e plotly.express?

Aug 17 2020

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.Linee px.Scatter. E vorrei dimostrare perché è fantastico che non lo sia.


Quindi, se pxsi 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 expectancyversus GDP per capitaper 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 pxe 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

7 vestland Aug 18 2020 at 00:22

Innanzitutto, se è richiesta una spiegazione delle differenze più ampie tra goe 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' colorattributo non assume un colore come redcome 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 1e 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.Alphabetcome 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 Alphabetsequenza 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 redadatto all'Asia, ma forse è un po 'troppo forte, puoi regolare l'opacità usando un rgbacolore 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'))