Plotly: Jak zdefiniować kolory na figurze za pomocą plotly.graph_objects i plotly.express?
Jest wiele pytań i odpowiedzi, które w ten czy inny sposób dotykają tego tematu. Tym wkładem chciałbym jasno pokazać, dlaczego takie łatwe podejście marker = {'color' : 'red'}będzie działać plotly.graph_objects (go), ale color='red'nie będzie, plotly.express (px)chociaż kolor jest atrybutem obu px.Linei px.Scatter. I chciałabym wykazać, dlaczego to jest niesamowite, że tak nie jest.
Jeśli więc pxma to być najłatwiejszy sposób na zrobienie fabularnej figury , to dlaczego robi coś tak pozornie oczywistego, jak color='red'zwracanie błędu
ValueError: Wartość „color” nie jest nazwą kolumny w „data_frame”.
Pozwól mi zademonstrować przez applyig Gapminder zestawu danych i pokazać wykres punktowy Life expectancyw porównaniu GDP per capitado wszystkich (przynajmniej większości ) krajach świata jak z 2007. Podstawowa konfiguracja, jak poniżej, da następujący wykres
Rysunek 1, wykreśl za pomocą go:
Kolor jest ustawiany przez cykl o nazwie plotly, ale jest tutaj określony za pomocą marker = {'color' : 'red'}
Rysunek 2, kod:
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()
Spróbujmy więc tego z pxi załóżmy, color='red'że to wystarczy:
Kod 2, spróbuj wykonać wykres punktowy ze zdefiniowanym kolorem przy użyciu 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',
)
Wynik:
ValueError: Wartość „color” nie jest nazwą kolumny w „data_frame”. Oczekiwano jednego z [„kraj”, „kontynent”, „rok”, „lifeExp”, „pop”, „gdpPercap”, „iso_alpha”, „iso_num”], ale otrzymano: czerwony
Więc co się tutaj dzieje?
Odpowiedzi
Po pierwsze, jeśli wymagane jest wyjaśnienie szerszych różnic między goi px, zajrzyj tutaj i tutaj . A jeśli absolutnie żadne wyjaśnienia nie są potrzebne, na samym końcu odpowiedzi znajdziesz pełny fragment kodu, który ujawni wiele mocy z kolorami w fabule .express
Część 1: Esencja:
Na początku może się tak nie wydawać, ale są bardzo dobre powody, dla color='red'których nie działa tak, jak można by się spodziewać px. Ale przede wszystkim, jeśli wszystko, co chcesz zrobić, to ręcznie ustawić konkretny kolor dla wszystkich markerów, możesz to zrobić .update_traces(marker=dict(color='red'))dzięki metodzie łańcuchowej Pythona . Ale najpierw spójrzmy na głuche ustawienia:
1.1 Fabularnie wyrażają domyślne
Rysunek 1, domyślny wykres rozrzutu w pikselach przy użyciu px.Scatter
Kod 1, domyślny wykres rozrzutu w pikselach przy użyciu 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")
Tutaj, jak już wspomniano w pytaniu, kolor jest ustawiany jako pierwszy kolor w domyślnej sekwencji wykresów dostępnej poprzez px.colors.qualitative.Plotly:
['#636EFA', # the plotly blue you can see above
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
I wygląda to całkiem nieźle. Ale co, jeśli chcesz coś zmienić, a nawet dodać więcej informacji w tym samym czasie?
1.2: Jak nadpisać wartości domyślne i zrobić dokładnie to , co chcesz z kolorami pikseli:
Jak już wspomnieliśmy px.scatter, coloratrybut nie przybiera koloru, jak redargument. Zamiast tego można na przykład użyć color='continent'do łatwego rozróżnienia różnych zmiennych w zbiorze danych. Ale kolory to o wiele więcej px:
Połączenie sześciu poniższych metod pozwoli Ci zrobić dokładnie to, co chcesz z kolorami za pomocą funkcji plotly express. Pamiętaj, że nie musisz nawet wybierać . Możesz użyć jednej , kilku lub wszystkich poniższych metod w tym samym czasie. Jedno szczególnie przydatne podejście ujawni się jako połączenie 1i 3. Ale za chwilę do tego dojdziemy. Oto, co musisz wiedzieć:
1. Zmień sekwencję kolorów używaną przez px za pomocą:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. Przypisz różne kolory do różnych zmiennych za pomocą color argumentu
color = 'continent'
3. dostosuj jeden lub więcej zmiennych kolorów za pomocą
color_discrete_map={"Asia": 'red'}
4. Łatwo grupuj większy podzbiór zmiennych, używając funkcji rozumienia dyktowania icolor_discrete_map
subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
5. Ustaw krycie za pomocą rgba()kodów kolorów.
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
6. Zastąp wszystkie ustawienia:
.update_traces(marker=dict(color='red'))
Część 2: Szczegóły i wątki
Poniższy fragment utworzy poniższy wykres, który pokazuje oczekiwaną długość życia na wszystkich kontynentach przy różnych poziomach PKB. Rozmiar znaczników reprezentuje różne poziomy populacji, aby od samego początku uczynić rzeczy bardziej interesującymi.
Fabuła 2:
Kod 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',
)
Aby zilustrować elastyczność powyższych metod, zmieńmy najpierw sekwencję kolorów . Ponieważ na początek pokazujemy tylko jedną kategorię i jeden kolor, będziesz musiał poczekać na kolejne kroki, aby zobaczyć rzeczywiste efekty. Ale oto teraz ta sama fabuła z color_discrete_sequence=px.colors.qualitative.Alphabetkrokiem 1:
1. Zmień sekwencję kolorów używaną przez px za pomocą
color_discrete_sequence=px.colors.qualitative.Alphabet
Teraz zastosujmy kolory z Alphabetsekwencji kolorów na różnych kontynentach:
2. Przypisz różne kolory do różnych zmiennych za pomocą color argumentu
color = 'continent'
Jeśli, tak jak ja, myślisz, że ta konkretna sekwencja kolorów jest przyjemna dla oka, ale być może trochę nie do odróżnienia, możesz przypisać wybrany kolor do jednego lub kilku kontynentów, takich jak ten:
3. dostosuj jeden lub więcej zmiennych kolorów za pomocą
color_discrete_map={"Asia": 'red'}
I to jest całkiem niesamowite: teraz możesz zmienić kolejność i wybrać dowolny kolor dla szczególnie interesujących zmiennych. Ale powyższa metoda może być nieco uciążliwa, jeśli chcesz przypisać określony kolor do większego podzbioru. Więc oto, jak możesz to zrobić za pomocą dyktowania ze zrozumieniem :
4. Przypisz grupie kolory za pomocą dyktowania icolor_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. Ustaw krycie za pomocą rgba()kodów kolorów.
Teraz cofnijmy się o krok. Jeśli uważasz, że redpasuje do Asi, ale być może jest trochę za mocny, możesz dostosować krycie za pomocą rgbakoloru takiego jak 'rgba(255,0,0,0.4)':
Pełny kod ostatniej działki:
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)'}
)
A jeśli uważasz, że teraz robimy się zbyt skomplikowani, możesz ponownie zmienić wszystkie ustawienia, takie jak te:
6. Zastąp wszystkie ustawienia:
.update_traces(marker=dict(color='red'))
A to prowadzi nas z powrotem do początku. Mam nadzieję, że okaże się to przydatne!
Uzupełnij fragment kodu ze wszystkimi dostępnymi opcjami:
# 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'))