如何在Altair中水平排列两个多面并排的图表?

时间:2019-10-30 14:27:19

标签: python altair

Altair使用构面方法为构面图表提供了可爱的功能。例如,以下数据集可以很好地可视化:

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

使用以下命令:

alt.Chart(df).mark_bar().encode(x='Year:O', y='Profile:Q').facet(row='Saison:N', column='Pos:N')

enter image description here

但是,您似乎可以在水平方向上放置很多地方,并且想通过将 Winter 情节重新排列在 Summer 情节旁边来使用它:

enter image description here

我了解到我已经使用列网格在属性Pos上进行了构面,但从视觉上来说, Winter Sommer 图是两个单独的图(就像here),我想将其并排放置。 我试图在同一个单元格中创建两个不同的图表,并使用html并排发出它们,但是在Jupyter环境中,每个单元格只有一个Altair / Vega图形存在限制。

我可以使用任何方法水平排列这些图表吗?

1 个答案:

答案 0 :(得分:1)

在Altair中,没有很好的方法,因为无法根据Vega-Lite模式嵌套多面图表。但是,尽管在架构上技术上不允许使用Vega-Lite渲染器,但实际上在某些情况下确实可以处理此问题。

因此您可以通过执行以下操作来破解它:

chart = alt.Chart(df).mark_bar().encode(
    x='Year:O',
    y='Profile:Q'
).facet('Saison:N')

spec = alt.FacetChart(
    data=df,
    spec=chart,
    facet=alt.Facet('Pos:N')
).to_json(validate=False)

print(spec)

可以将生成的规范手动粘贴到http://vega.github.io/editor中以显示此(vega editor link):

enter image description here

您甚至会注意到vega编辑器将规范的某些部分标记为无效。诚然,这不是最令人满意的答案,但是可以解决问题。

希望在将来,Vega-Lite模式将增加对嵌套面的实际支持,因此可以从Altair中直接使用它们。