Plotly: วิธีกำหนดสีในรูปโดยใช้ plotly.graph_objects และ plotly.express
มีคำถามและคำตอบมากมายที่เกี่ยวข้องกับหัวข้อนี้ไม่ทางใดก็ทางหนึ่ง ด้วยการบริจาคนี้ฉันต้องการที่จะแสดงให้เห็นอย่างชัดเจนว่าทำไม approch ง่ายเช่นmarker = {'color' : 'red'}
การทำงานจะสำหรับplotly.graph_objects (go)
แต่color='red'
จะไม่ได้สำหรับplotly.express (px)
แม้ว่าสีเป็นคุณลักษณะของทั้งสองและpx.Line
และฉันอยากจะแสดงให้เห็นว่าทำไมมันถึงยอดเยี่ยมที่มันไม่ทำpx.Scatter
ดังนั้นถ้าpx
มันควรจะเป็นวิธีที่ง่ายที่สุดในการสร้างร่างพล็อตเหตุใดสิ่งที่เห็นได้ชัดอย่างที่เห็นได้ชัดคือcolor='red'
ส่งคืนข้อผิดพลาด
ValueError: ค่าของ 'color' ไม่ใช่ชื่อของคอลัมน์ใน 'data_frame'
ให้ฉันสาธิตโดยใช้ชุดข้อมูลgapminderและแสดง scatterplot Life expectancy
เทียบกับGDP per capita
ทุกประเทศ (อย่างน้อยที่สุด ) ทั่วโลก ณ2007
วันที่ การตั้งค่าพื้นฐานดังต่อไปนี้จะสร้างพล็อตต่อไปนี้
รูปที่ 1 พล็อตโดยใช้go
:

สีถูกกำหนดโดยวงจรที่ชื่อplotlyแต่ระบุไว้ที่นี่โดยใช้ marker = {'color' : 'red'}
รูปที่ 2 รหัส:
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()
ลองทำดูpx
และสมมติว่าcolor='red'
จะใช้เคล็ดลับ:
รหัส 2 พยายามกระจายพล็อตด้วยสีที่กำหนดโดยใช้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',
)
ผลลัพธ์:
ValueError: ค่าของ 'color' ไม่ใช่ชื่อของคอลัมน์ใน 'data_frame' คาดว่าจะเป็นหนึ่งใน ['country', 'ทวีป', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] แต่ได้รับ: สีแดง
เกิดอะไรขึ้นที่นี่?
คำตอบ
ขั้นแรกหากคำอธิบายความแตกต่างระหว่างที่กว้างขึ้นgo
และpx
เป็นสิ่งจำเป็นโปรดใช้เวลาดูที่นี่และที่นี่ และหากไม่จำเป็นต้องมีคำอธิบายใด ๆ คุณจะพบข้อมูลโค้ดที่สมบูรณ์ที่ท้ายคำตอบซึ่งจะเผยให้เห็นพลังหลายอย่างที่มีสีในเชิงวางแผน Express
ส่วนที่ 1: สาระสำคัญ:
มันอาจจะไม่ดูเหมือนดังนั้นในตอนแรก แต่มีมากเหตุผลดีว่าทำไมไม่ทำงานตามที่คุณอาจคาดหวังใช้color='red'
px
แต่แรกของทั้งหมดถ้าสิ่งที่คุณต้องการจะทำคือการตั้งค่าสีโดยเฉพาะอย่างยิ่งสำหรับเครื่องหมายทั้งหมดด้วยตนเองคุณสามารถทำได้โดยใช้.update_traces(marker=dict(color='red'))
ขอบคุณที่งูเหลือมวิธีการผูกมัด แต่ก่อนอื่นให้ดูที่การตั้งค่าคนหูหนวก:
1.1 ค่าเริ่มต้นที่แสดงไว้อย่างชัดเจน
รูปที่ 1, พิกเซลเริ่มต้นโดยใช้ scatterplot px.Scatter

รหัส 1, scatterplot เริ่มต้นของ 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")
ดังที่ได้กล่าวไปแล้วในคำถามสีจะถูกกำหนดเป็นสีแรกในลำดับการลงจุดเริ่มต้นที่มีให้ผ่านpx.colors.qualitative.Plotly
:
['#636EFA', # the plotly blue you can see above
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
และนั่นก็ดูดีทีเดียว แต่ถ้าคุณต้องการเปลี่ยนแปลงสิ่งต่างๆและเพิ่มข้อมูลเพิ่มเติมในเวลาเดียวกันล่ะ?
1.2: วิธีการแทนที่ค่าเริ่มต้นและทำว่าสิ่งที่คุณต้องการด้วยสี px:
ตามที่เราได้อ่านมาpx.scatter
แล้วcolor
แอตทริบิวต์ไม่ได้ใช้สีเหมือนred
เป็นอาร์กิวเมนต์ แต่คุณสามารถใช้color='continent'
เพื่อแยกความแตกต่างระหว่างตัวแปรต่างๆในชุดข้อมูลได้อย่างง่ายดาย แต่มีสีอื่น ๆ อีกมากมายในpx
:
การรวมกันของวิธีการที่หกต่อไปนี้จะช่วยให้คุณทำว่าสิ่งที่คุณต้องการด้วยสีที่ใช้ plotly ด่วน จำไว้ว่าคุณไม่ได้มีการเลือก คุณสามารถใช้อย่างใดอย่างหนึ่ง , บางส่วนหรือทั้งหมดของวิธีการดังต่อไปนี้ในเวลาเดียวกัน และวิธีการที่มีประโยชน์อย่างใดอย่างหนึ่งจะเปิดเผยตัวเองเป็น combinatino ของและ1
3
แต่เราจะไปถึงจุดนั้นในอีกสักครู่ นี่คือสิ่งที่คุณต้องรู้:
1. เปลี่ยนลำดับสีที่ใช้โดย px ด้วย:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. กำหนดสีต่างๆให้กับตัวแปรที่แตกต่างกันด้วย color
อาร์กิวเมนต์
color = 'continent'
3. ปรับแต่งสีตัวแปรอย่างน้อยหนึ่งสีด้วย
color_discrete_map={"Asia": 'red'}
4. จัดกลุ่มตัวแปรย่อยที่ใหญ่กว่าของคุณได้อย่างง่ายดายโดยใช้การเข้าใจตามคำบอกและcolor_discrete_map
subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
5. ตั้งค่าความทึบโดยใช้rgba()
รหัสสี
color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
6. แทนที่การตั้งค่าทั้งหมดด้วย:
.update_traces(marker=dict(color='red'))
ส่วนที่ 2: รายละเอียดและแปลง
ตัวอย่างต่อไปนี้จะสร้างพล็อตด้านล่างที่แสดงอายุการใช้งานสำหรับทุกทวีปสำหรับ GDP ในระดับต่างๆ ขนาดของเครื่องหมายแสดงถึงระดับต่างๆของประชากรเพื่อทำให้สิ่งต่างๆน่าสนใจมากขึ้นตั้งแต่เริ่มต้น
แปลง 2:

รหัส 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',
)
แสดงให้เห็นถึงความยืดหยุ่นของวิธีการดังกล่าวข้างต้นจะช่วยให้แรกเพียงแค่เปลี่ยนลำดับสี เนื่องจากเราสำหรับ starters จะแสดงเพียงหมวดหมู่เดียวและสีเดียวคุณจะต้องรอขั้นตอนต่อไปเพื่อดูเอฟเฟกต์จริง แต่นี่เป็นพล็อตเดียวกันกับcolor_discrete_sequence=px.colors.qualitative.Alphabet
ตามขั้นตอนที่ 1:
1. เปลี่ยนลำดับสีที่ใช้โดย px ด้วย
color_discrete_sequence=px.colors.qualitative.Alphabet

ตอนนี้ขอใช้สีจากAlphabet
ลำดับสีกับทวีปต่างๆ:
2. กำหนดสีต่างๆให้กับตัวแปรที่แตกต่างกันด้วย color
อาร์กิวเมนต์
color = 'continent'

ถ้าคุณชอบฉันคิดว่าลำดับสีเฉพาะนี้เป็นเรื่องง่ายในสายตา แต่อาจแยกไม่ออกเล็กน้อยคุณสามารถกำหนดสีที่คุณเลือกให้กับหนึ่งทวีปหรือมากกว่าได้ดังนี้:
3. ปรับแต่งสีตัวแปรอย่างน้อยหนึ่งสีด้วย
color_discrete_map={"Asia": 'red'}

และนี่ก็ยอดเยี่ยมมาก: ตอนนี้คุณสามารถเปลี่ยนลำดับและเลือกสีใดก็ได้ที่คุณต้องการสำหรับตัวแปรที่น่าสนใจโดยเฉพาะ แต่วิธีการข้างต้นอาจน่าเบื่อเล็กน้อยหากคุณต้องการกำหนดสีเฉพาะให้กับชุดย่อยที่ใหญ่กว่า ดังนั้นนี่คือวิธีที่คุณสามารถทำได้ด้วยความเข้าใจแบบเขียนตามคำบอก :
4.กำหนดสีให้กับกลุ่มโดยใช้ความเข้าใจตามคำบอกและcolor_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.ตั้งค่าความทึบโดยใช้rgba()
รหัสสี
ตอนนี้ขอถอยหลังหนึ่งก้าว หากคุณคิดว่าred
เหมาะกับเอเชีย แต่อาจจะแรงไปหน่อยคุณสามารถปรับความทึบได้โดยใช้rgba
สีที่ต้องการ'rgba(255,0,0,0.4)'
เพื่อให้ได้สิ่งนี้:

รหัสที่สมบูรณ์สำหรับพล็อตสุดท้าย:
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)'}
)
และถ้าคุณคิดว่าตอนนี้เราซับซ้อนเกินไปคุณสามารถลบล้างการตั้งค่าทั้งหมดเช่นนี้ได้อีกครั้ง:
6.แทนที่การตั้งค่าทั้งหมดด้วย:
.update_traces(marker=dict(color='red'))

และสิ่งนี้ทำให้เรากลับไปสู่จุดเริ่มต้น ฉันหวังว่าคุณจะพบว่าสิ่งนี้มีประโยชน์!
กรอกข้อมูลโค้ดพร้อมตัวเลือกทั้งหมดที่มีให้:
# 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'))