【问题标题】:How can I arrange two faceted side-by-side charts horizontally in Altair?如何在 Altair 中水平排列两个多面并排图表?
【发布时间】:2019-10-31 05:00:01
【问题描述】:

Altair 为使用 facet 方法的 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')

但是,正如你所看到的,我在水平方向上仍有很多地方,并希望通过重新排列 Summer 图旁边的 Winter 图来使用它: p>

我知道我已经使用柱状网格来分面属性 Pos,但在视觉上对我来说 WinterSommer 图是两个独立的图(就像 @987654323 @),我想并排放置。 我尝试在同一个单元格中创建两个不同的图表并使用 html 将它们并排发出,但在 Jupyter 环境中,每个单元格只能有一个 Altair/Vega 图。

有什么方法可以用来水平排列这些图表吗?

【问题讨论】:

    标签: python altair


    【解决方案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):

    您甚至会注意到 vega 编辑器将规范的某些部分标记为无效。诚然,这不是最令人满意的答案,但它确实有效。

    希望将来 Vega-Lite 架构能够添加对嵌套构面的实际支持,以便可以更直接地从 Altair 中使用它们。

    【讨论】:

    • 我是否正确理解不能直接在 Jupyter Notebook 中可视化此规范?
    • 类似:我的假设是否正确,即没有办法在同一个单元格内显示两个 Vega 图表?如果这是可能的,我可以使用 html 样式进行侧面输出。此外,它还提供了以编程方式发出多个图表的可能性(这在其他情况下非常方便)
    • 第一个问题:在 Jupyter notebook 中可视化这个规范是可能的,但并不容易,因为 Altair 在显示之前会无条件地验证规范。我已经打开github.com/altair-viz/altair/issues/1763 来放松一下。第二个问题:您可以在输出框中显示任意数量的图表。只需在您要显示的每个图表上调用chart.display()(对于通过评估单元格最后一行产生的图表自动完成此操作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多