簡體   English   中英

如何在 Altair 中向多面圖表添加圖層?

[英]How to add layers to a faceted chart in Altair?

Altair 是一個可愛的可視化庫,具有非常直觀的可視化語法 API。 但是,我正在努力將帶有規則標記的圖層添加到多面圖表中。

假設你有一個簡單的數據集:

print(df[['Year', 'Profile', 'Saison', 'Pos']].to_csv())
,Year,Profile,Saison,Pos
0,2017,6.0,Sommer,VL
1,2017,6.0,Winter,VL
13,2017,6.0,Winter,HL
12,2017,6.0,Sommer,HL
18,2017,6.0,Sommer,HR
6,2017,6.0,Sommer,VR
7,2017,6.0,Winter,VR
19,2017,6.0,Winter,HR
14,2018,5.5,Winter,HL
8,2018,5.5,Winter,VR
15,2018,5.5,Sommer,HL
20,2018,4.3,Winter,HR
21,2018,5.0,Sommer,HR
3,2018,5.5,Sommer,VL
2,2018,6.2,Winter,VL
9,2018,4.5,Sommer,VR
17,2019,4.5,Sommer,HL
11,2019,4.2,Sommer,VR
22,2019,3.5,Winter,HR
10,2019,5.28,Winter,VR
5,2019,4.6,Sommer,VL
4,2019,4.9,Winter,VL
16,2019,4.0,Winter,HL
23,2019,4.5,Sommer,HR

比你可以簡單地顯示它:

base = alt.Chart(df[df.Saison=='Winter']).mark_bar().encode(x='Year:O', y='Profile:Q', column='Pos:N')
base

在此處輸入圖像描述

比,假設我想添加水平標記來可視化一些限制:

在此處輸入圖像描述

為此,我定義了 DataSet:

print(Limits.to_csv())
,Profil
0,3.0
1,1.5

並將其添加到圖表集合中:

limits = alt.Chart(Limits).mark_rule(color='red').encode(y='Profil')
base + limits

這不起作用並生成錯誤:

ValueError: Faceted charts cannot be layered.

我怎樣才能克服這個限制? 底層的 vega-light 語法顯然支持如此復雜的層組合,但我不知道如何在 Altair 中表達它。

您不能對分面圖進行分層,因為通常不能保證每一層的內容都包含兼容的分面。

但是,您可以刻面分層圖表。 它可能看起來像這樣:

import altair as alt
import pandas as pd
import io

df = pd.read_csv(io.StringIO("""
,Year,Profile,Saison,Pos
0,2017,6.0,Sommer,VL
1,2017,6.0,Winter,VL
13,2017,6.0,Winter,HL
12,2017,6.0,Sommer,HL
18,2017,6.0,Sommer,HR
6,2017,6.0,Sommer,VR
7,2017,6.0,Winter,VR
19,2017,6.0,Winter,HR
14,2018,5.5,Winter,HL
8,2018,5.5,Winter,VR
15,2018,5.5,Sommer,HL
20,2018,4.3,Winter,HR
21,2018,5.0,Sommer,HR
3,2018,5.5,Sommer,VL
2,2018,6.2,Winter,VL
9,2018,4.5,Sommer,VR
17,2019,4.5,Sommer,HL
11,2019,4.2,Sommer,VR
22,2019,3.5,Winter,HR
10,2019,5.28,Winter,VR
5,2019,4.6,Sommer,VL
4,2019,4.9,Winter,VL
16,2019,4.0,Winter,HL
23,2019,4.5,Sommer,HR
"""))

bars = alt.Chart().mark_bar().encode(
    x='Year:O',
    y='Profile:Q',
)

limits = alt.Chart(
  pd.DataFrame({'Profil': [3, 1.5]})
).mark_rule(
  color='red'
).encode(y='Profil')

alt.layer(
    bars,
    limits,
    data=df[df.Saison=='Winter']
).facet(
    'Pos:N',
)

在此處輸入圖像描述

在這里指定數據有點棘手: facet()方法在調用它的圖表中鍵控頂層數據,因此當您從不同數據集構建的分面層時,您需要在頂層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM