Plotly: Bagaimana cara menentukan warna pada gambar menggunakan plotly.graph_objects dan plotly.express?
Ada banyak pertanyaan dan jawaban yang menyentuh topik ini dengan satu atau lain cara. Dengan kontribusi ini, saya ingin menunjukkan dengan jelas mengapa pendekatan yang mudah seperti marker = {'color' : 'red'}
akan berhasil plotly.graph_objects (go)
, tetapi color='red'
tidak akan berhasil plotly.express (px)
meskipun warna adalah atribut dari keduanya px.Line
dan px.Scatter
. Dan saya ingin mendemonstrasikan mengapa mengagumkan bahwa tidak.
Jadi, jika px
seharusnya menjadi cara termudah untuk membuat gambar plot , lalu mengapa sesuatu yang jelas seperti color='red'
mengembalikan kesalahan
ValueError: Nilai 'color' bukanlah nama kolom di 'data_frame'.
Izinkan saya mendemonstrasikan dengan menerapkan set data gapminder dan menunjukkan diagram sebar dari Life expectancy
versus GDP per capita
untuk semua (setidaknya sebagian besar ) negara di seluruh dunia pada 2007
. Pengaturan dasar seperti di bawah ini akan menghasilkan plot berikut
Gambar 1, plot menggunakan go
:

Warna diatur oleh siklus bernama plotly tetapi di sini ditentukan menggunakan marker = {'color' : 'red'}
Gambar 2, kode:
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()
Jadi mari kita coba ini dengan px
, dan asumsikan itu color='red'
akan berhasil:
Kode 2, coba sebar plot dengan warna yang ditentukan menggunakan 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',
)
Hasil:
ValueError: Nilai 'color' bukanlah nama kolom di 'data_frame'. Diharapkan salah satu dari ['country', 'continental', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] tetapi menerima: red
Jadi apa yang terjadi disini?
Jawaban
Pertama, jika penjelasan tentang perbedaan yang lebih luas antara go
dan px
diperlukan, harap lihat di sini dan di sini . Dan jika sama sekali tidak diperlukan penjelasan, Anda akan menemukan cuplikan kode lengkap di akhir jawaban yang akan mengungkapkan banyak kekuatan dengan warna di plotly.express
Bagian 1: Esensi:
Pada awalnya mungkin tidak tampak begitu, tetapi ada alasan yang sangat bagus mengapa color='red'
tidak berfungsi seperti yang Anda harapkan px
. Tapi pertama-tama, jika semua yang Anda ingin lakukan adalah mengatur warna tertentu secara manual untuk semua penanda Anda dapat melakukannya dengan menggunakan .update_traces(marker=dict(color='red'))
berkat Piton metode chaining . Tapi pertama-tama, mari kita lihat pengaturan deafult:
1.1 Secara plot mengungkapkan default
Gambar 1, menggunakan sebar default px px.Scatter

Kode 1, menggunakan sebar default px 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")
Di sini, seperti yang telah disebutkan dalam pertanyaan, warna ditetapkan sebagai warna pertama dalam urutan plot default yang tersedia melalui px.colors.qualitative.Plotly
:
['#636EFA', # the plotly blue you can see above
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
Dan itu terlihat cukup bagus. Tetapi bagaimana jika Anda ingin mengubah banyak hal dan bahkan menambahkan lebih banyak informasi pada saat yang bersamaan?
1.2: Cara menimpa default dan melakukan persis apa yang Anda inginkan dengan warna px:
Seperti yang telah kita bahas sebelumnya px.scatter
, color
atribut tidak mengambil warna seperti red
argumen. Sebaliknya, Anda dapat menggunakan misalnya color='continent'
untuk dengan mudah membedakan antara variabel yang berbeda dalam kumpulan data. Tapi ada lebih banyak warna px
:
Kombinasi dari enam metode berikut akan membiarkan Anda melakukan persis apa yang Anda suka dengan warna menggunakan plotly mengungkapkan. Ingatlah bahwa Anda bahkan tidak harus memilih . Anda dapat menggunakan satu , beberapa , atau semua metode di bawah ini secara bersamaan. Dan satu pendekatan berguna tertentu akan menampakkan dirinya sebagai kombinasi dari 1
dan 3
. Tapi kita akan membahasnya sebentar lagi. Inilah yang perlu Anda ketahui:
1. Ubah urutan warna yang digunakan oleh px dengan:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. Tetapkan warna berbeda untuk variabel berbeda dengan color
argumen
color = 'continent'
3. menyesuaikan satu atau lebih warna variabel dengan
color_discrete_map={"Asia": 'red'}
4. Mudah mengelompokkan subset yang lebih besar dari variabel Anda menggunakan pemahaman dikt dancolor_discrete_map
subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
5. Atur opasitas menggunakan rgba()
kode warna.
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
6. Ganti semua pengaturan dengan:
.update_traces(marker=dict(color='red'))
Bagian 2: Detail dan plotnya
Cuplikan berikut akan menghasilkan plot di bawah ini yang menunjukkan harapan hidup untuk semua benua dengan berbagai tingkat PDB. Ukuran penanda mewakili berbagai tingkat populasi untuk membuat segalanya lebih menarik sejak awal.
Plot 2:

Kode 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',
)
Untuk mengilustrasikan fleksibilitas metode di atas, pertama-tama mari ubah urutan warna . Karena kami sebagai permulaan hanya menampilkan satu kategori dan satu warna, Anda harus menunggu langkah selanjutnya untuk melihat efek sebenarnya. Tapi inilah plot yang sama sekarang dengan color_discrete_sequence=px.colors.qualitative.Alphabet
per langkah 1:
1. Ubah urutan warna yang digunakan oleh px dengan
color_discrete_sequence=px.colors.qualitative.Alphabet

Sekarang, mari terapkan warna dari Alphabet
urutan warna ke berbagai benua:
2. Tetapkan warna berbeda untuk variabel berbeda dengan color
argumen
color = 'continent'

Jika Anda, seperti saya, berpikir bahwa urutan warna khusus ini mudah dilihat tetapi mungkin agak tidak dapat dibedakan, Anda dapat menetapkan warna pilihan Anda ke satu atau lebih benua seperti ini:
3. menyesuaikan satu atau lebih warna variabel dengan
color_discrete_map={"Asia": 'red'}

Dan ini sangat mengagumkan: Sekarang Anda dapat mengubah urutan dan memilih warna yang Anda inginkan untuk variabel yang sangat menarik. Tetapi metode di atas bisa menjadi sedikit membosankan jika Anda ingin menetapkan warna tertentu ke subset yang lebih besar. Jadi, inilah cara Anda dapat melakukannya juga dengan pemahaman dict :
4. Tetapkan warna ke grup menggunakan pemahaman dikt dancolor_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. Atur opasitas menggunakan rgba()
kode warna.
Sekarang mari mundur satu langkah. Jika menurut Anda red
cocok untuk Asia, tetapi mungkin agak terlalu kuat, Anda dapat menyesuaikan opasitas menggunakan rgba
warna seperti 'rgba(255,0,0,0.4)'
ini:

Kode lengkap untuk plot terakhir:
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)'}
)
Dan jika menurut Anda kami menjadi terlalu rumit sekarang, Anda dapat mengganti semua pengaturan seperti ini lagi:
6. Ganti semua pengaturan dengan:
.update_traces(marker=dict(color='red'))

Dan ini membawa kita kembali ke tempat kita memulai. Saya harap ini berguna bagi Anda!
Cuplikan kode lengkap dengan semua opsi yang tersedia:
# 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'))