Plotly: วิธีกำหนดสีในรูปโดยใช้ plotly.graph_objects และ plotly.express

Aug 17 2020

มีคำถามและคำตอบมากมายที่เกี่ยวข้องกับหัวข้อนี้ไม่ทางใดก็ทางหนึ่ง ด้วยการบริจาคนี้ฉันต้องการที่จะแสดงให้เห็นอย่างชัดเจนว่าทำไม 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'] แต่ได้รับ: สีแดง

เกิดอะไรขึ้นที่นี่?

คำตอบ

7 vestland Aug 18 2020 at 00:22

ขั้นแรกหากคำอธิบายความแตกต่างระหว่างที่กว้างขึ้น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'))