การแสดงภาพแบบไดนามิกและเชิงโต้ตอบโดยใช้ Altair
Python มีไลบรารีการแสดงภาพมากมายเพื่อนำข้อมูลของคุณไปสู่มุมมองภาพ ไม่ต้องพูดถึงการโต้ตอบ เรามี Matplotlib ซึ่งเป็นไลบรารี่ที่โตเต็มที่และได้รับความนิยมพร้อมตัวเลือกการปรับแต่งมากมาย ไลบรารีอื่นๆ เช่น seaborn ซึ่งมี wrapper ระดับสูงอยู่ด้านบนของ matplotlib เพื่อสร้างภาพที่ดูดีขึ้นด้วยโค้ดที่ซับซ้อนน้อยกว่า ในทำนองเดียวกัน สำหรับพล็อตไดนามิกและการโต้ตอบ เรามีพล็อต โบเก้ และโฟเลียม
เหนือสิ่งอื่นใด เรายังมีห้องสมุด Altair ที่สวยงามซึ่งมีการประกาศโดยธรรมชาติและไวยากรณ์มีพื้นฐานมาจาก Vega & Vega-lite หนึ่งในคุณสมบัติหลักของ Altair คือไวยากรณ์ที่เรียบง่ายและใช้งานง่าย ซึ่งช่วยให้ผู้ใช้สามารถสร้างการแสดงภาพที่ซับซ้อนได้อย่างรวดเร็วด้วยโค้ดที่น้อยที่สุด
หนึ่งในคุณสมบัติที่ทรงพลังที่สุดของ Altair คือความสามารถในการรวมแผนภูมิประเภทต่างๆ เข้าด้วยกันได้อย่างง่ายดายในการแสดงภาพเดียว สิ่งนี้ช่วยให้ผู้ใช้สามารถสร้างกราฟิกที่ซับซ้อนซึ่งสื่อสารข้อมูลหลายชั้นได้อย่างมีประสิทธิภาพ
ข้อได้เปรียบที่สำคัญอีกประการหนึ่งของ Altair คือการโต้ตอบ ด้วยโค้ดเพียงไม่กี่บรรทัด ผู้ใช้สามารถสร้างการแสดงภาพแบบไดนามิกที่ช่วยให้สำรวจข้อมูลด้วยวิธีใหม่ๆ ได้
นี่คือการดูไวยากรณ์ของ Altair:
import altair as alt from vega_datasets import data iris = data.iris.url chart1 = alt.Chart(iris).mark_point().encode( x='petalLength:Q', y='petalWidth:Q', color='species:N' ).properties( height=300, width=300 ) chart2 = alt.Chart(iris).mark_bar().encode( x='count()', y=alt.Y('petalWidth:Q', bin=alt.Bin(maxbins=30)), color='species:N' ).properties( height=300, width=100 ) chart1 | chart2
โค้ดด้านบนอาจดูซับซ้อนและเข้าใจยาก มั่นใจได้เลยว่าเราจะถอดรหัสได้ในตอนท้ายของบทความนี้
มาดำดิ่งลงไป… และในขณะที่เราดำเนินไป เราจะสามารถชื่นชมไวยากรณ์ Vega ที่สวยงามได้ นี่อาจเป็นบทความเบื้องต้น แต่ก็มีพลังที่จะพาคุณจากการเริ่มต้นไปสู่การพิจารณา Altair เป็นตัวขับเคลื่อนรายวัน
การติดตั้งและการนำเข้า
- แพนด้าสำหรับการถกเถียงเรื่องข้อมูล
- vega_datasetsสำหรับข้อมูล
- altair สำหรับ … ก็…
#Installation pip install pandas pip install vega_datasets pip intsall altair #Imports import pandas as pd from vega_datasets import data import altair as alt
กำลังโหลดชุดข้อมูล
เราจะใช้ชุดข้อมูล 'รถยนต์' ที่ฉันชื่นชอบ ต่อไปนี้เป็นวิธีเรียกมัน
cars = data.cars()
ชุดข้อมูลประกอบด้วยข้อมูลเกี่ยวกับรถยนต์รุ่นต่างๆ และประสิทธิภาพการใช้เชื้อเพลิง (วัดเป็นไมล์ต่อแกลลอนหรือ MPG) นอกจากนี้ยังมีข้อมูลเกี่ยวกับที่มาของรถ ปริมาตรกระบอกสูบ จำนวนกระบอกสูบ แรงม้า น้ำหนัก รุ่นปี และความเร่งอีกด้วย และแน่นอนว่าเป็นชื่อรถด้วย
การวางแผน
- การเขียนกราฟ Altair จำเป็นต้องประกาศข้อมูลใน Chart ระดับฐานก่อน ข้อมูลอาจอยู่ในรูปแบบของ dataframe Pandas, ออบเจ็กต์ alt Data, URL ที่ชี้ไปยังไฟล์ json และ csv หรือข้อมูลทางภูมิศาสตร์
- เรายังจำเป็นต้องกำหนดเครื่องหมาย ซึ่งเป็นข้อมูลที่ว่าเราต้องการให้คุณลักษณะทางภาพของเราปรากฏบนโครงเรื่องอย่างไร อาจเป็นจุด เส้น แถบ ฯลฯ
- จากนั้นการเข้ารหัสจะใช้ในการแมปคอลัมน์กับคุณลักษณะภาพของพล็อต
มารวบรวมทั้งหมดนี้เข้าด้วยกัน
ก่อนอื่นเราจะเรียกเมธอด Chart แล้วชี้ไปที่ dataframe ของรถยนต์ของเรา ตอนนี้เราบอกอัลแตร์ว่าเราต้องการเครื่องหมายรูปร่างใด ในที่นี้ เราเรียกใช้เมธอด mark_point เนื่องจากเราต้องการคะแนนสำหรับพล็อตนี้
alt.Chart(cars).mark_point()
เนื่องจากเรายังไม่ได้ให้พิกัด altair จึงวางจุดทั้งหมดไว้ในที่เดียว ดังนั้นเราจึงมี 406 จุดทับซ้อนกันที่จุดเดียวบนแผนภูมิ
สิ่งที่เหลืออยู่คือบอกอัลแตร์ว่าเราต้องการจุดไหน ตรงนี้ เราจะพล็อต "ไมล์ต่อแกลลอน" บนแกน x เป็นจุด
alt.Chart(cars).mark_point().encode( x='Miles_per_Gallon' )
เราได้รับพล็อต 1D ของจุดข้อมูลทั้งหมดที่แสดงถึง 'mpg' สำหรับรถแต่ละคัน
มาเพิ่ม 'น้ำหนัก' ให้กับแกน y
alt.Chart(cars).mark_point().encode( x='Miles_per_Gallon', y='Weight_in_lbs' )
เราได้รับพล็อตกระจายที่จัดวางอย่างสวยงามเนื่องจากจุดของเรากำลังถูกเข้ารหัสด้วยค่าบนแต่ละแกน
แล้วเราจะเปลี่ยนตัวแปรแกน y ให้เป็นตัวแปรเด็ดขาดล่ะ มาใช้ประเทศของ "ต้นกำเนิด" กันเถอะ
alt.Chart(cars).mark_point().encode( x='Miles_per_Gallon', y='Origin' )
เราจะเห็นว่าข้อมูล 'mpg' กระจายไปทั่วทั้งสามประเทศอย่างไร
แล้วการใช้มาร์กประเภทอื่นล่ะ มาเปลี่ยนไปใช้เห็บโดยใช้วิธี mark_tick
alt.Chart(cars).mark_point().encode( x='Miles_per_Gallon', y='Origin' )
เราสามารถเพิ่มมิติอื่นได้โดยการกำหนดพารามิเตอร์ สี ลองใช้ตัวแปร 'Cylinders' ให้ใช้เฉพาะรถยนต์ที่มี 4, 6 และ 8 สูบเท่านั้น
#Filtering to get cars with 4, 6 and 8 cylinders cars = cars.loc[cars.Cylinders.isin([4,6,8])] alt.Chart(cars).mark_tick().encode( x='Miles_per_Gallon', y='Origin', color='Cylinders' )
ลองเปลี่ยนกลับไปใช้แผนภูมิกระจายระหว่าง 'mpg' & 'น้ำหนัก' และแบ่งแกน x ออกเป็นช่องๆ ไวยากรณ์ของ Altair โดดเด่นที่นี่ เนื่องจากเราสามารถกำหนดวัตถุ alt.X ให้กับแกน x ได้ ตอนนี้เราสามารถส่งผ่านพารามิเตอร์อื่นๆ ไปยังค่านั้นได้ มาเปิดใช้งาน binning โดยการส่งค่าบูลีนไปยังพารามิเตอร์ bin เราจะเก็บชุดข้อมูลไว้กรองเป็นรถยนต์ 4, 6 และ 8 สูบ
alt.Chart(cars).mark_point().encode( x=alt.X('Miles_per_Gallon', bin=True), y='Weight_in_lbs', color='Cylinders' )
เราจะเห็นได้ว่าตอนนี้ binning ได้รวมกลุ่มจุดต่างๆ ให้เป็นเส้นแนวตั้งแล้ว ให้แทนที่เครื่องหมายด้วยแท่ง
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=True), y='Weight_in_lbs', color='Cylinders' )
เราได้พล็อตแท่งเหล็กซ้อนกันที่ดูดีซึ่งแสดงให้เห็นอย่างชัดเจนว่ายานพาหนะที่หนักกว่านั้นมีประสิทธิภาพการใช้เชื้อเพลิงน้อยกว่า นอกจากนี้รถยนต์ที่มีจำนวนกระบอกสูบมากกว่าก็มีประสิทธิภาพต่ำกว่าตามที่คาดไว้
ลองแทนที่แกน y ด้วยจำนวนค่าในแต่ละถังบนแกน X ไหม เราสามารถทำได้โดยการแทนที่ชื่อคอลัมน์ที่กำหนดให้กับแกน Y ด้วยฟังก์ชัน count() กำจัดพารามิเตอร์ color ไปก่อน
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=True), y='count()' )
ขณะนี้เรามีฮิสโตแกรมที่ดีซึ่งนับค่าในแต่ละถังที่กำหนดไว้บนแกน X เราสามารถเปลี่ยนการวางแนวได้โดยเพียงแค่กำหนดแกนใหม่
alt.Chart(cars).mark_bar().encode( x='count()', y=alt.Y('Miles_per_Gallon', bin=True) )
คุณสามารถเปลี่ยนจำนวนถังขยะได้โดยการส่งวัตถุ alt.Bin ไปยังพารามิเตอร์ bin แทนที่จะเป็นบูลีน สิ่งนี้ทำให้สามารถโต้แย้งได้มากขึ้น
มาเพิ่มจำนวนถังขยะที่นี่โดยใช้พารามิเตอร์ maxbins ภายในวัตถุ alt.Bin ระวังข้อมูล — ความสมดุลของเสียงรบกวนเมื่อคุณใช้พารามิเตอร์ดังกล่าว
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=25)), y='count()' )
แล้วเราจะนำพารามิเตอร์ color กลับมาได้อย่างไร
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=10)), y='count()', color='Origin' )
ตอนนี้เรามีฮิสโตแกรมแบบเรียงซ้อน
เรามาแนะนำมิติอื่นที่นี่โดยการกำหนดพารามิเตอร์ คอลัมน์ ฉันจะใช้ตัวแปร 'Cylinders' สำหรับสิ่งนี้ การดำเนินการนี้จะแบ่งพล็อตออกเป็นหลายๆ พล็อตซ้อนกันในคอลัมน์ โดยแต่ละพล็อตจะแสดงหมวดหมู่ในตัวแปร Cylinders ใช้พารามิเตอร์ row หากคุณต้องการให้พล็อตถูกจัดวางเป็นแถว
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=10)), y='count()', color='Origin', column='Cylinders' )
จะเกิดอะไรขึ้นถ้าเรากำหนดพารามิเตอร์สีให้กับตัวแปรต่อเนื่อง
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=10)), y='count()', color='Horsepower', column='Cylinders' )
สังเกตว่าจานสีเปลี่ยนไปเป็นสีต่อเนื่องและคำอธิบายจะถูกแทนที่ด้วยแถบสีเพื่อแสดงถึงสีเดียวกัน
ที่นี่ฉันใช้ตัวแปร Cylinders เป็นตัวแปรประเภท เราสามารถให้ altair เปลี่ยนวิธีการอ่านตัวแปรนั้นได้โดยส่ง :Qหลังชื่อคอลัมน์ เพื่อหลีกเลี่ยงความจำเป็นในการเปลี่ยนประเภทข้อมูลของคอลัมน์ในชุดข้อมูลของเรา
เปลี่ยนเป็นพล็อตเดียวแล้วใช้ Cylinders เป็นสี คราวนี้เราจะใช้เป็นตัวแปรต่อเนื่อง
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=10)), y='count()', color='Cylinders:Q' )
และถ้าเราอยากเปลี่ยนกลับไปเป็น Cylinders ให้เป็นตัวแปรเด็ดขาด การใช้ :Nจะช่วยให้ altair อ่าน Cylinders เป็นตัวแปรระบุได้
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=10)), y='count()', color='Cylinders:N' )
บ่อยครั้งที่มีความจำเป็นต้องรวบรวมข้อมูลและเราสามารถทำได้ที่นี่โดยไม่ต้องจัดกลุ่มตามดาต้าเฟรมของเราก่อนแล้วจึงป้อนเป็นอินพุตไปยังแท่นบูชา เราใช้ฟังก์ชัน mean ที่นี่เพื่อดำเนินการดังกล่าว
มาดูประสิทธิภาพการใช้เชื้อเพลิงโดยเฉลี่ย('mpg')ของรถยนต์ในแต่ละประเทศของต้นทางกัน ตอนนี้เรามาติดบาร์กันก่อน เนื่องจากเราต้องการเปรียบเทียบค่าเฉลี่ย mpgของแต่ละประเทศ เราจึงสามารถกำหนดสีของตัวเองให้แต่ละแท่งได้โดยการแมป 'Origin' เข้ากับพารามิเตอร์สี
alt.Chart(cars).mark_bar().encode( x='mean(Miles_per_Gallon):Q', y='Origin:N', color='Origin:N' )
มากำหนดสีให้กับการรวมกันดีกว่า มานับกัน
alt.Chart(cars).mark_bar().encode( x='mean(Miles_per_Gallon):Q', y='Origin:N', color='count()' )
เราสามารถแบ่งแกน X ออกเป็นช่องๆ แทนที่จะเป็นค่าเฉลี่ย และให้แต่ละส่วนกำหนดสีตามการนับ
alt.Chart(cars).mark_bar().encode( x=alt.X('Miles_per_Gallon:Q', bin=alt.Bin(maxbins=10)), y='Origin:N', color='count()' )
แล้วเราจะเปลี่ยนไปใช้แผนภูมิวงกลมกัน ตอนนี้เราพล็อตจำนวนรถยนต์ในชุดข้อมูลตามประเทศของต้นทาง เราเปลี่ยนประเภทการทำเครื่องหมายเป็นส่วนโค้ง กำหนดมุมของแต่ละชิ้นในพารามิเตอร์ theta จากนั้นกำหนดวิธีการทำงานของ สี โปรดจำไว้ว่า เรามีวัตถุ Alt ที่เกี่ยวข้องซึ่งเราสามารถส่งผ่านไปยังพารามิเตอร์เหล่านี้ได้ และวัตถุเหล่านี้สามารถรับข้อโต้แย้งเพิ่มเติมเพื่อให้เราปรับแต่งผลลัพธ์ของเราได้
โปรดสังเกตว่าตอนนี้เราได้เปลี่ยนมาใช้วิธีเรียกข้อโต้แย้งที่ชัดเจนยิ่งขึ้น นี่เป็นสิทธิพิเศษเป็นหลัก
alt.Chart(cars).mark_arc().encode( theta=alt.Theta( field='Miles_per_Gallon', type='quantitative', aggregate='count' ), color=alt.Color( field='Origin', type='nominal' ) )
เราสามารถกำหนดพารามิเตอร์เพิ่มเติมให้กับเมธอด mark_arc และเปลี่ยนเป็นพล็อตโดนัทได้ ส่งต่ออาร์กิวเมนต์ innerRadius & radius
alt.Chart(cars).mark_arc( innerRadius=65, radius=120 ).encode( theta=alt.Theta( field='Miles_per_Gallon', type='quantitative', aggregate='count' ), color=alt.Color( field='Origin', type='nominal' ) )
แล้วเราจะกำหนด ตัวแปร ให้กับรัศมีไหม สามารถทำได้โดยใช้วัตถุ alt.Radius
alt.Chart(cars).mark_arc( innerRadius=30 ).encode( theta=alt.Theta( field='Miles_per_Gallon', type='quantitative', aggregate='count', stack=True ), color=alt.Color( field='Cylinders', type='ordinal' ), radius=alt.Radius( field='Miles_per_Gallon:Q', aggregate='count' ) )
แผนภูมินี้น่าจะเหมาะสมกว่าหากหมวดหมู่มีมากกว่า (เช่น 5) และมีข้อมูลที่เปรียบเทียบได้ในแง่ของการนับ
ลองจินตนาการถึงแผนภาพฟองที่แสดงความสัมพันธ์ระหว่าง mpg และ น้ำหนัก ของยานพาหนะ เราสามารถเพิ่มมิติอื่นๆ ได้โดยการจัดสรร ขนาด ให้กับ การกระจัดและ สี ให้กับ origin
alt.Chart(cars).mark_point( fillOpacity=0.2 ).encode( x='Miles_per_Gallon', y='Weight_in_lbs', size='Displacement', color='Origin' )
Altar ให้ตัวเลือกแก่คุณในการรวมแผนภูมิหลายประเภท หากต้องการรวมหลายแปลง คุณมีตัวเลือกในการใช้ตัวดำเนินการเช่น'+', '&' และ '|' คุณยังมีตัวเลือกในการใช้ vconcat และ hconcat ตัวอย่างที่จะปฏิบัติตาม
ลองตรวจสอบว่าประสิทธิภาพการใช้เชื้อเพลิงโดยรวม (mpg) เปลี่ยนแปลงไปอย่างไรเมื่อเวลาผ่านไปในประเทศเหล่านี้ และในขณะที่เรากำลังดำเนินการอยู่ เรามาวางแผนช่วงความเชื่อมั่นกันดีกว่า สำหรับสิ่งนี้ เรารวม mark_line และ mark_errorband
line = alt.Chart(cars).mark_line().encode( x=alt.X( field='Year', type='temporal' ), y=alt.Y( field='Miles_per_Gallon', type='quantitative', aggregate='mean' ) ) band = alt.Chart(cars).mark_errorband( extent='ci' ).encode( x=alt.X( field='Year', type='temporal' ), y=alt.Y( field='Miles_per_Gallon', type='quantitative', title='Miles Per Gallon' ) ) line + band
เรามาทำเครื่องหมายเส้นแนวตั้งบนโครงเรื่องเพื่อแยกรถที่ผลิตก่อนปี 75 และหลัง
line = alt.Chart(cars).mark_line().encode( x=alt.X( field='Year', type='temporal' ), y=alt.Y( field='Miles_per_Gallon', type='quantitative', aggregate='mean' ) ) band = alt.Chart(cars).mark_errorband( extent='ci' ).encode( x=alt.X( field='Year', type='temporal' ), y=alt.Y( field='Miles_per_Gallon', type='quantitative', title='Miles Per Gallon' ) ) xrule = alt.Chart(cars).mark_rule( color='gray', strokeWidth=1.5, strokeDash=[10,5] ).encode( x=alt.datum( alt.DateTime( year=1975, month='December', date=31 ) ) ) line + band + xrule
คุณสามารถดูโครงเรื่องแบบโต้ตอบซึ่งคุณสามารถวางเมาส์ไว้เพื่อดูข้อมูลเพิ่มเติม
การพูดของการโต้ตอบ เรามาดูวิธีการทำงานกัน
ฉันจะเปลี่ยนกลับไปใช้แผนภูมิกระจายระหว่าง mpg และ น้ำหนัก สีแสดงถึงต้นกำเนิดของยานพาหนะดังกล่าว โพสต์การเข้ารหัส ฉันใช้วิธีการ โต้ตอบ สิ่งนี้จะทำให้เราโต้ตอบในระดับพื้นฐานกับการแพนและซูมเส้นโครงเรื่อง
alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color='Origin:N' ).interactive()
มาพล็อตหลาย ๆ พล็อตแล้วลองสร้างการโต้ตอบระหว่างกัน
ลองใช้พล็อตด้านบนตามที่เป็นอยู่และเพิ่มพล็อตอื่นด้านล่างโดยใช้วิธี vconcat แผนที่สองสามารถแสดงจำนวนยานพาหนะในประเทศต้นทางที่กำหนด
สิ่งที่เราตั้งเป้าที่จะสร้างคือชุดของแปลงที่สามารถโต้ตอบกันเองได้ เช่น. การเลือกจุดบนแผนภูมิกระจายจะเปลี่ยนข้อมูลที่แสดงในแผนภูมิอื่นที่เกี่ยวข้องโดยอัตโนมัติ
เนื่องจากการแพนและซูมไม่ใช่องค์ประกอบเชิงโต้ตอบเพียงอย่างเดียวที่เราต้องการให้มี เรามากำจัดเมธอด เชิงโต้ตอบ กันดีกว่า
scatter_plot = alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color='Origin:N' ) bar_plot = alt.Chart(cars).mark_bar().encode( x='count()', y='Origin:N', color='Origin:N' ) alt.vconcat(scatter_plot, bar_plot)
ตอนนี้เรามีแปลงแล้ว ขั้นตอนที่ 1 คือการเปิดใช้งานการเลือกจุดในแผนภาพกระจาย เราใช้วัตถุ alt.selection_interval เพื่อควบคุมสิ่งเดียวกัน จากนั้นเราป้อนออบเจ็กต์การเลือกตามคุณสมบัติของแผนภูมิกระจายเพื่อให้ตอบสนองต่อการเลือก
select = alt.selection_interval(encodings=['x', 'y']) scatter_plot = alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color='Origin:N' ).properties( selection=select ) bar_plot = alt.Chart(cars).mark_bar().encode( x='count()', y='Origin:N', color='Origin:N' ) alt.vconcat(scatter_plot, bar_plot)
ขณะนี้การเลือกไม่ได้ทำอะไรเลย แต่เรารู้ว่ามีการเลือกอยู่ มาแมปในลักษณะที่จุดต่างๆ ภายในส่วนที่เลือกถูกไฮไลต์ ในขณะที่จุดอื่นๆ เปลี่ยนสีเป็นสีเทา ในการดำเนินการดังกล่าว เราใช้ออบเจ็กต์ alt.condition กับพารามิเตอร์ สี และใช้การเลือกที่กำหนดไว้ก่อนหน้านี้เป็นเงื่อนไข
select = alt.selection_interval(encodings=['x', 'y']) scatter_plot = alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color=alt.condition(select, 'Origin:N', alt.value('Lightgray')) ).properties( selection=select ) bar_plot = alt.Chart(cars).mark_bar().encode( x='count()', y='Origin:N', color='Origin:N' ) alt.vconcat(scatter_plot, bar_plot)
ตอนนี้ส่วนที่เลือกทำงานได้ตามที่เราต้องการ เรามาเชื่อมต่อกับแผนภูมิแท่งเพื่อให้แผนภูมิแท่งแสดงการกระจายความถี่ของเครื่องหมายที่เลือก เราใช้วิธี transform_select บนแผนภูมิแท่งเพื่อดำเนินการดังกล่าว
select = alt.selection_interval(encodings=['x', 'y']) scatter_plot = alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color=alt.condition(select, 'Origin:N', alt.value('Lightgray')) ).properties( selection=select ) bar_plot = alt.Chart(cars).mark_bar().encode( x='count()', y='Origin:N', color='Origin:N' ).transform_filter(select) alt.vconcat(scatter_plot, bar_plot)
โครงเรื่องแบบโต้ตอบที่น่าทึ่งพร้อมฐานโค้ดที่ใช้งานง่าย แล้วการเลือกแบบย้อนกลับที่เราสามารถเลือกแถบบนแผนภูมิแท่งและแสดงเฉพาะจุดของประเทศที่เกี่ยวข้องในแผนภาพกระจายได้
select = alt.selection_interval(encodings=['x', 'y']) multiple_select = alt.selection_multi(fields=['Origin']) scatter_plot = alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color=alt.condition(select, 'Origin:N', alt.value('Lightgray')) ).properties( selection=select ).transform_filter(multiple_select) bar_plot = alt.Chart(cars).mark_bar().encode( x='count()', y='Origin:N', color='Origin:N' ).transform_filter(select).properties(selection=multiple_select) alt.vconcat(scatter_plot, bar_plot)
ตัวอย่างสุดท้ายของฟังก์ชันการทำงานที่ยอดเยี่ยมนี้
select = alt.selection_interval(encodings=['x', 'y']) multiple_select = alt.selection_multi(fields=['Origin']) scatter_plot = alt.Chart(cars).mark_point().encode( x='Weight_in_lbs:Q', y='Miles_per_Gallon:Q', color=alt.condition(select, 'Origin:N', alt.value('Lightgray')) ).properties( selection=select ).transform_filter(multiple_select) bar_plot = alt.Chart(cars).mark_bar().encode( x='mean(Weight_in_lbs)', y=alt.Y('Miles_per_Gallon', bin=alt.Bin(maxbins=10)), color='Origin:N' ).transform_filter(select).properties(selection=multiple_select) alt.hconcat(scatter_plot, bar_plot)
สิ่งนี้จะช่วยให้คุณเริ่มต้นใช้งานไลบรารีการแสดงภาพ Altair ได้ มีคุณสมบัติและการปรับแต่งมากมายที่คุณสามารถใช้ได้ สำหรับการอ้างอิง คุณสามารถไปที่เอกสารอย่างเป็นทางการ มีความสุขในการวางแผน!