如何在 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
那么,假设我想添加水平标记以可视化一些限制:
为此我定义了数据集:
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 语法显然 supports 如此复杂的层组合,但我不知道如何在 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()
方法会关闭调用它的图表中的顶级数据,因此当您对从不同数据集构建的图层进行分面时,您需要在顶层指定相关数据。
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
那么,假设我想添加水平标记以可视化一些限制:
为此我定义了数据集:
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 语法显然 supports 如此复杂的层组合,但我不知道如何在 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()
方法会关闭调用它的图表中的顶级数据,因此当您对从不同数据集构建的图层进行分面时,您需要在顶层指定相关数据。