Plotly: ¿Cómo definir colores en una figura usando plotly.graph_objects y plotly.express?

Aug 17 2020

Hay muchas preguntas y respuestas que tocan este tema de una forma u otra. Con esta contribución me gustaría mostrar claramente por qué un enfoque fácil como marker = {'color' : 'red'}funciona plotly.graph_objects (go), pero color='red'no, plotly.express (px)aunque el color es un atributo de ambos px.Liney px.Scatter. Y me gustaría demostrar por qué es increíble que no sea así.


Entonces, si pxse supone que es la forma más fácil de hacer una figura gráfica , entonces ¿por qué algo tan aparentemente obvio como color='red'devolver el error?

ValueError: el valor de 'color' no es el nombre de una columna en 'data_frame'.

Permítanme demostrar aplicando un conjunto de datos gapminder y mostrar un diagrama de dispersión de Life expectancyversus GDP per capitapara todos (al menos la mayoría ) de los países del mundo a partir de 2007. Una configuración básica como la siguiente producirá la siguiente gráfica

Figura 1, grafique usando go:

El color se establece mediante un ciclo llamado plotly pero aquí se especifica usando marker = {'color' : 'red'}

Figura 2, código:

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()

Así que intentemos esto pxy supongamos que funcionaría color='red':

Código 2, intento de diagrama de dispersión con color definido usando 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',
          )

Resultado:

ValueError: el valor de 'color' no es el nombre de una columna en 'data_frame'. Se esperaba uno de ['país', 'continente', 'año', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] pero se recibió: rojo

Entonces, ¿qué está pasando aquí?

Respuestas

7 vestland Aug 18 2020 at 00:22

Primero, si se requiere una explicación de las diferencias más amplias entre goy px, consulte aquí y aquí . Y si no se necesita absolutamente ninguna explicación, encontrará un fragmento de código completo al final de la respuesta que revelará muchos de los poderes con colores en plotly.express


Parte 1: La esencia:

Puede que no lo parezca al principio, pero hay muy buenas razones por las color='red'que no funciona como cabría esperar px. Pero antes que nada, si todo lo que desea hacer es establecer manualmente un color particular para todos los marcadores , puede hacerlo usando .update_traces(marker=dict(color='red'))gracias al método de encadenamiento de pitones . Pero primero, veamos la configuración de sordos:

1.1 Plotly exprese los valores predeterminados

Figura 1, diagrama de dispersión predeterminado de px usando px.Scatter

Código 1, diagrama de dispersión predeterminado de px usando 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")

Aquí, como ya se mencionó en la pregunta, el color se establece como el primer color en la secuencia de trazado predeterminada disponible a través de px.colors.qualitative.Plotly:

['#636EFA', # the plotly blue you can see above
 '#EF553B',
 '#00CC96',
 '#AB63FA',
 '#FFA15A',
 '#19D3F3',
 '#FF6692',
 '#B6E880',
 '#FF97FF',
 '#FECB52']

Y eso se ve bastante bien. Pero, ¿qué pasa si desea cambiar las cosas e incluso agregar más información al mismo tiempo?

1.2: Cómo anular los valores predeterminados y hacer exactamente lo que quiere con los colores px:

Como ya mencionamos px.scatter, el coloratributo no toma un color como redcomo argumento. Más bien, puede utilizar, por ejemplo, color='continent'para distinguir fácilmente entre diferentes variables en un conjunto de datos. Pero hay mucho más en los colores en px:


La combinación de los seis métodos siguientes le permitirá hacer exactamente lo que le gustaría con colores usando plotly express. Tenga en cuenta que ni siquiera tiene que elegir . Puede utilizar uno , algunos o todos los métodos siguientes al mismo tiempo. Y un enfoque útil particular se revelará como una combinación de 1y 3. Pero llegaremos a eso en un momento. Esto es lo que necesitas saber:

1. Cambie la secuencia de colores utilizada por px con:

color_discrete_sequence=px.colors.qualitative.Alphabet

2. Asignar diferentes colores a diferentes variables con el color argumento

color = 'continent'

3. personalice uno o más colores variables con

color_discrete_map={"Asia": 'red'}

4. Agrupe fácilmente un subconjunto más grande de sus variables mediante la comprensión de dictados ycolor_discrete_map

subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}

5. Configure la opacidad mediante rgba()códigos de color.

color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}

6. Anule todas las configuraciones con:

.update_traces(marker=dict(color='red'))

Parte 2: Los detalles y las tramas

El siguiente fragmento producirá el gráfico a continuación que muestra la esperanza de vida para todos los continentes para diferentes niveles de PIB. El tamaño de los marcadores representa diferentes niveles de población para hacer las cosas más interesantes desde el principio.

Parcela 2:

Codigo 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',
          )

Para ilustrar la flexibilidad de los métodos anteriores, primero cambiemos la secuencia de colores . Dado que, para empezar, solo mostramos una categoría y un color, tendrá que esperar los pasos siguientes para ver los efectos reales. Pero aquí está la misma trama ahora con el color_discrete_sequence=px.colors.qualitative.Alphabetpaso 1:

1. Cambie la secuencia de colores utilizada por px con

color_discrete_sequence=px.colors.qualitative.Alphabet

Ahora, apliquemos los colores de la Alphabetsecuencia de colores a los diferentes continentes:

2. Asignar diferentes colores a diferentes variables con el color argumento

color = 'continent'

Si usted, como yo, cree que esta secuencia de colores en particular es agradable a la vista pero quizás un poco indistinguible, puede asignar un color de su elección a uno o más continentes como este:

3. personalice uno o más colores variables con

color_discrete_map={"Asia": 'red'}

Y esto es bastante impresionante: ahora puede cambiar la secuencia y elegir el color que desee para las variables particularmente interesantes. Pero el método anterior puede volverse un poco tedioso si desea asignar un color en particular a un subconjunto más grande. Así que así es como puede hacer eso también con una comprensión de dict :

4. Asignar colores a un grupo usando un dictado de comprensión ycolor_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. Configure la opacidad mediante rgba()códigos de color.

Ahora retrocedamos un paso. Si crees que se redadapta bien a Asia, pero quizás es un poco demasiado fuerte, puedes ajustar la opacidad usando un rgbacolor como 'rgba(255,0,0,0.4)'este:

Código completo para la última parcela:

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)'}
          )

Y si cree que nos estamos volviendo un poco complicados a esta altura, puede anular todas las configuraciones como esta nuevamente:

6. Anule todas las configuraciones con:

.update_traces(marker=dict(color='red'))

Y esto nos lleva de regreso a donde comenzamos. ¡Espero que encuentre esto útil!

Fragmento de código completo con todas las opciones 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'))