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

3

Altair提供了一种方便的功能,使用facet方法来分面图表。例如,以下数据集可视化效果很好:

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')

输入图像描述

但是,正如你所看到的,我仍然有很多水平的空间,并希望通过重新排列冬季情节,将其直接放在夏季情节旁边:

输入图像描述

我知道我已经使用了列网格来在属性Pos上进行分面,但对我来说,视觉上冬季夏季情节就像两个单独的情节(就像这里一样),我想将它们并排放置。 我尝试在同一个单元格中创建两个不同的图表,并使用html将它们并排发出,但在Jupyter环境中,每个单元格只能有一个Altair/Vega图。

是否有任何方法可以使这些图表横向排列?

1个回答

2
在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中,以显示此内容(enter image description here

您甚至会注意到,Vega编辑器将规范的某些部分标记为无效。虽然这并不是最令人满意的答案,但它基本上可以起作用。

希望在未来,Vega-Lite模式将添加对嵌套外观的实际支持,以便它们可以更直接地从Altair中使用。


我理解的是否正确,无法直接在Jupyter Notebook中可视化此规范? - Anton Golubev
类似的问题:我的假设是,没有办法在同一个单元格内显示两个 Vega 图表,这个假设正确吗?如果可能的话,我可以使用 HTML 样式进行侧面输出。此外,它还打开了以编程方式发出多个图表的可能性(这对其他情况非常方便)。 - Anton Golubev
第一个问题:在Jupyter笔记本中可视化此规范是可能的,但并不容易,因为Altair在显示之前无条件验证规范。我已经打开了https://github.com/altair-viz/altair/issues/1763来放宽这个限制。第二个问题:您可以在输出框架中显示任意数量的图表。只需对每个要显示的图表调用“chart.display()”(对于从单元格的最后一行评估而得出的图表,这将自动完成)。 - jakevdp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接