【问题标题】:How to sort values based on selection in an Altair chart?如何根据 Altair 图表中的选择对值进行排序?
【发布时间】:2020-11-01 22:01:26
【问题描述】:

给定一个这样的交互式面积图:

import altair as alt
from vega_datasets import data

source = data.iowa_electricity()
selection = alt.selection(type='multi', fields=['source'], bind='legend')

alt.Chart(source).mark_area().encode(
    x="year:T",
    y="net_generation:Q",
    color="source:N",
    opacity=alt.condition(selection, alt.value(1), alt.value(0.1))
).add_selection(selection)

我想首先对选定的值进行排序,以便它们从底部堆叠起来,并且不会像下面的示例中那样“悬而未决”:

但是,我不知道如何在转换中表达这一点。唯一有效的是transform_filter(selection),但这会完全删除未选中的值。

这是不可能的还是我错过了什么?

【问题讨论】:

    标签: altair


    【解决方案1】:

    您可以这样做的一种方法是访问calculate transform 中的选择内容,使用vega expression 来查找当前列是否在选择中。此时,您可以将顺序设置为这种编码:

    import altair as alt
    from vega_datasets import data
    
    source = data.iowa_electricity()
    selection = alt.selection(type='multi', fields=['source'], bind='legend')
    
    alt.Chart(source).add_selection(
        selection
    ).transform_calculate(
        order=f"indexof({selection.name}.source || [], datum.source)",
    ).mark_area().encode(
        x="year:T",
        y="net_generation:Q",
        color="source:N",
        opacity=alt.condition(selection, alt.value(1), alt.value(0.1)),
        order=alt.Order("order:N", sort='descending'),
    ).add_selection(selection)
    

    【讨论】:

    • 非常感谢您的出色回答!任何地方都记录了这个巧妙技巧的元素,尤其是 selection 具有 name 属性的部分?我想它会返回,例如["Fossil Fuels", "Renewables"],那么 Javascript 中的插值表达式是 ["Fossil Fuels", "Renewables"].source。在这里我画了一个空白,不再明白了......?
    • 这里有一个在表达式中使用选择值的示例:altair-viz.github.io/user_guide/… 选择对象由 vega 表达式中的名称引用,它为每个字段返回一个选定值列表那个字段。
    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 2015-10-02
    • 2020-01-10
    • 1970-01-01
    • 2023-04-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多