การแสดงภาพแบบไดนามิกและเชิงโต้ตอบโดยใช้ 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 เป็นตัวขับเคลื่อนรายวัน

การติดตั้งและการนำเข้า

  1. แพนด้าสำหรับการถกเถียงเรื่องข้อมูล
  2. vega_datasetsสำหรับข้อมูล
  3. 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) นอกจากนี้ยังมีข้อมูลเกี่ยวกับที่มาของรถ ปริมาตรกระบอกสูบ จำนวนกระบอกสูบ แรงม้า น้ำหนัก รุ่นปี และความเร่งอีกด้วย และแน่นอนว่าเป็นชื่อรถด้วย

การวางแผน

  1. การเขียนกราฟ Altair จำเป็นต้องประกาศข้อมูลใน Chart ระดับฐานก่อน ข้อมูลอาจอยู่ในรูปแบบของ dataframe Pandas, ออบเจ็กต์ alt Data, URL ที่ชี้ไปยังไฟล์ json และ csv หรือข้อมูลทางภูมิศาสตร์
  2. เรายังจำเป็นต้องกำหนดเครื่องหมาย ซึ่งเป็นข้อมูลที่ว่าเราต้องการให้คุณลักษณะทางภาพของเราปรากฏบนโครงเรื่องอย่างไร อาจเป็นจุด เส้น แถบ ฯลฯ
  3. จากนั้นการเข้ารหัสจะใช้ในการแมปคอลัมน์กับคุณลักษณะภาพของพล็อต

มารวบรวมทั้งหมดนี้เข้าด้วยกัน

ก่อนอื่นเราจะเรียกเมธอด 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 ได้ มีคุณสมบัติและการปรับแต่งมากมายที่คุณสามารถใช้ได้ สำหรับการอ้างอิง คุณสามารถไปที่เอกสารอย่างเป็นทางการ มีความสุขในการวางแผน!