Plotly: Wie definiere ich Farben in einer Figur mit plotly.graph_objects und plotly.express?
Es gibt viele Fragen und Antworten, die dieses Thema auf die eine oder andere Weise berühren. Mit diesem Beitrag möchte ich klar zeigen, warum ein einfacher Ansatz wie marker = {'color' : 'red'}dieser funktioniert plotly.graph_objects (go), aber color='red'nicht, plotly.express (px)obwohl Farbe ein Attribut von beiden px.Lineund ist px.Scatter. Und ich möchte zeigen, warum es großartig ist, dass dies nicht der Fall ist.
Also, wenn pxes der einfachste Weg sein soll, eine Handlung zu machen , warum macht dann etwas so offensichtlich Offensichtliches wie color='red'den Fehler zurückzugeben
ValueError: Der Wert von 'color' ist nicht der Name einer Spalte in 'data_frame'.
Lassen Sie mich durch Anwenden eines Gapminder- Datensatzes demonstrieren und ein Streudiagramm von Life expectancyVersus GDP per capitafür alle (zumindest die meisten ) Länder auf der ganzen Welt ab zeigen 2007. Eine Grundeinstellung wie unten erzeugt das folgende Diagramm
Abbildung 1, Diagramm mit go:
Die Farbe wird durch einen Zyklus mit dem Namen plotly festgelegt , der hier jedoch mit angegeben wird marker = {'color' : 'red'}
Abbildung 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()
Versuchen wir es also mit pxund nehmen an, dass color='red'dies den Trick tun würde:
Code 2, Versuch eines Streudiagramms mit definierter Farbe unter Verwendung von 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',
)
Ergebnis:
ValueError: Der Wert von 'color' ist nicht der Name einer Spalte in 'data_frame'. Erwartet eines von ['Land', 'Kontinent', 'Jahr', 'LifeExp', 'Pop', 'gdpPercap', 'iso_alpha', 'iso_num'], aber erhalten: rot
Also, was ist hier los?
Antworten
Wenn zunächst eine Erklärung der größeren Unterschiede zwischen gound pxerforderlich ist, schauen Sie bitte hier und hier nach . Und wenn absolut keine Erklärungen benötigt werden, finden Sie ganz am Ende der Antwort einen vollständigen Code-Ausschnitt, der viele der Kräfte mit Farben in plotly.express enthüllt
Teil 1: Die Essenz:
Es mag zunächst nicht so scheinen, aber es gibt sehr gute Gründe, warum color='red'es nicht so funktioniert, wie Sie es vielleicht erwarten px. Wenn Sie jedoch zunächst manuell eine bestimmte Farbe für alle Marker festlegen möchten , können Sie dies mithilfe .update_traces(marker=dict(color='red'))der Python-Verkettungsmethode tun . Aber zuerst schauen wir uns die gehörlosen Einstellungen an:
1.1 Standardeinstellungen ausdrücken
Abbildung 1, px-Standardstreudiagramm mit px.Scatter
Code 1, px Standard-Streudiagramm mit 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")
Wie bereits in der Frage erwähnt, wird hier die Farbe als erste Farbe in der Standard-Plotsequenz festgelegt, die verfügbar ist durch px.colors.qualitative.Plotly:
['#636EFA', # the plotly blue you can see above
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
Und das sieht ziemlich gut aus. Aber was ist, wenn Sie Dinge ändern und gleichzeitig noch mehr Informationen hinzufügen möchten?
1.2: So überschreiben Sie die Standardeinstellungen und machen mit px-Farben genau das , was Sie wollen:
Wie wir bereits angesprochen haben px.scatter, nimmt das colorAttribut keine Farbe wie redals Argument an. Vielmehr können Sie beispielsweise color='continent'einfach zwischen verschiedenen Variablen in einem Dataset unterscheiden. Aber Farben bieten noch viel mehr px:
Mit der Kombination der sechs folgenden Methoden können Sie mit Plotly Express genau das tun , was Sie möchten. Denken Sie daran, dass Sie nicht einmal wählen müssen . Sie können eine , einige oder alle der folgenden Methoden gleichzeitig verwenden. Und ein besonders nützlicher Ansatz wird sich als eine Kombination von 1und herausstellen 3. Aber wir werden gleich darauf zurückkommen. Folgendes müssen Sie wissen:
1. Ändern Sie die von px verwendete Farbsequenz mit:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. Weisen Sie verschiedenen Variablen mit dem Argument unterschiedliche Farben zucolor
color = 'continent'
3. Passen Sie eine oder mehrere variable Farben mit an
color_discrete_map={"Asia": 'red'}
4. Gruppieren Sie einfach eine größere Teilmenge Ihrer Variablen mithilfe von Diktatverständnis undcolor_discrete_map
subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
5. Stellen Sie die Deckkraft mithilfe von rgba()Farbcodes ein.
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
6. Überschreiben Sie alle Einstellungen mit:
.update_traces(marker=dict(color='red'))
Teil 2: Die Details und die Handlungen
Das folgende Snippet zeigt die folgende Darstellung, die die Lebenserwartung für alle Kontinente bei unterschiedlichen BIP-Werten zeigt. Die Größe der Marker repräsentiert verschiedene Bevölkerungsstufen, um die Dinge von Anfang an interessanter zu machen.
Grundstück 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',
)
Um die Flexibilität der oben genannten Methoden zu veranschaulichen, ändern wir zunächst einfach die Farbsequenz . Da wir für den Anfang nur eine Kategorie und eine Farbe anzeigen, müssen Sie auf die folgenden Schritte warten, um die tatsächlichen Effekte zu sehen. Aber hier ist die gleiche Handlung color_discrete_sequence=px.colors.qualitative.Alphabetwie in Schritt 1:
1. Ändern Sie die von px verwendete Farbsequenz mit
color_discrete_sequence=px.colors.qualitative.Alphabet
Wenden wir nun die Farben aus der AlphabetFarbsequenz auf die verschiedenen Kontinente an:
2. Weisen Sie verschiedenen Variablen mit dem Argument unterschiedliche Farben zucolor
color = 'continent'
Wenn Sie wie ich der Meinung sind, dass diese bestimmte Farbsequenz augenschonend, aber möglicherweise etwas ununterscheidbar ist, können Sie einem oder mehreren Kontinenten wie folgt eine Farbe Ihrer Wahl zuweisen:
3. Passen Sie eine oder mehrere variable Farben mit an
color_discrete_map={"Asia": 'red'}
Und das ist ziemlich großartig: Jetzt können Sie die Reihenfolge ändern und eine beliebige Farbe für besonders interessante Variablen auswählen. Die oben beschriebene Methode kann jedoch etwas langwierig werden, wenn Sie einer größeren Teilmenge eine bestimmte Farbe zuweisen möchten. So können Sie das auch mit einem Diktatverständnis machen :
4. Weisen Sie einer Gruppe Farben mit einem Diktatverständnis zu undcolor_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. Stellen Sie die Deckkraft mithilfe von rgba()Farbcodes ein.
Jetzt machen wir einen Schritt zurück. Wenn Sie der Meinung sind, dass es gut redzu Asien passt, aber vielleicht etwas zu stark ist, können Sie die Deckkraft mithilfe einer rgbaFarbe wie folgt anpassen 'rgba(255,0,0,0.4)':
Vollständiger Code für die letzte Handlung:
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)'}
)
Und wenn Sie der Meinung sind, dass wir jetzt etwas zu kompliziert werden, können Sie alle Einstellungen wie folgt erneut überschreiben:
6. Überschreiben Sie alle Einstellungen mit:
.update_traces(marker=dict(color='red'))
Und das bringt uns zurück zu unserem Ausgangspunkt. Ich hoffe, Sie finden das nützlich!
Vollständiges Code-Snippet mit allen verfügbaren Optionen:
# 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'))