【问题标题】:How to add a slider to a choropleth in altair?如何在 altair 中将滑块添加到等值线?
【发布时间】:2020-04-01 02:09:00
【问题描述】:

我正在尝试向我的等值线图添加一个滑块。
滑块基于 2006 年至 2012 年的“年”
我的数据是这样的:

可以从这里下载:
sample_data.csv
当我绘制县级等值线时,它正在使用 transform_lookup 对县进行内部连接 ​​w.r.t fips 代码
这是我的代码:

slider = alt.binding_range(min=2006, max=2012, step=1)
select_year = alt.selection_single(name="year", fields=['year'],
                                   bind=slider, init={'year': 2006})

alt.Chart(us_counties).mark_geoshape(
    stroke='black',
    strokeWidth=0.05
).project(
    type='albersUsa'
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(fdf, 'fips', ['Pill_per_pop','year'])
).transform_calculate(
    Pill_per_pop='isValid(datum.Pill_per_pop) ? datum.Pill_per_pop : -1'  
).encode(
    color = alt.condition(
        'datum.Pill_per_pop > 0',
        alt.Color('Pill_per_pop:Q', scale=Scale(scheme='blues')),
        alt.value('#dbe9f6')
    )).add_selection(
    select_year
).properties(
    width=700,
    height=400
).transform_filter(
    select_year
)


这段代码给了我一个带有滑块的等值线图,但这些图是错误的。
我觉得它是第一次出现 fips 代码,而不是根据年份进行过滤。
我觉得这是因为将县 ID 映射到 fips 代码的 transform_lookup 方法。
这是输出:

【问题讨论】:

    标签: python-3.x vega altair vega-lite


    【解决方案1】:

    您是正确的,查找转换仅找到第一个匹配索引 - 它是单边连接,而不是多连接。如果您想为每个键连接多个数据条目,则必须使用具有多列的数据集。

    对于您的数据,您可以使用 pandas pivot 方法生成这样的数据集,然后在 Altair 中您可以在查找后使用 fold transform 撤消此操作

    对于您的数据,它可能看起来像这样:

    import altair as alt
    import pandas as pd
    from vega_datasets import data
    
    us_counties = alt.topo_feature(data.us_10m.url, 'counties')
    fdf = pd.read_csv('https://raw.githubusercontent.com/sdasara95/Opioid-Crisis/master/sample_data.csv')
    fdf['year'] = fdf['year'].astype(str)
    fdf = fdf.pivot(index='fips', columns='year', values='Pill_per_pop').reset_index()
    columns = [str(year) for year in range(2006, 2013)]
    
    slider = alt.binding_range(min=2006, max=2012, step=1)
    select_year = alt.selection_single(name="year", fields=['year'],
                                       bind=slider, init={'year': 2006})
    
    alt.Chart(us_counties).mark_geoshape(
        stroke='black',
        strokeWidth=0.05
    ).project(
        type='albersUsa'
    ).transform_lookup(
        lookup='id',
        from_=alt.LookupData(fdf, 'fips', columns)
    ).transform_fold(
        columns, as_=['year', 'Pill_per_pop']
    ).transform_calculate(
        year='parseInt(datum.year)',
        Pill_per_pop='isValid(datum.Pill_per_pop) ? datum.Pill_per_pop : -1'  
    ).encode(
        color = alt.condition(
            'datum.Pill_per_pop > 0',
            alt.Color('Pill_per_pop:Q', scale=alt.Scale(scheme='blues')),
            alt.value('#dbe9f6')
        )).add_selection(
        select_year
    ).properties(
        width=700,
        height=400
    ).transform_filter(
        select_year
    )
    

    【讨论】:

    • 我正在使用您的方法,但我无法做到。我已按要求共享数据。
    • 用数据更新了答案——问题是我假设年份列是字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多