Python 3.x 如何将滑块添加到altair中的choropleth?

Python 3.x 如何将滑块添加到altair中的choropleth?,python-3.x,vega,altair,vega-lite,Python 3.x,Vega,Altair,Vega Lite,我正在尝试为我的choropleth绘图添加一个滑块 滑块基于从2006年到2012年的“年数” 我的数据如下: 可从此处下载: 当我绘制县级choropleth时,它正在使用transform_lookup为county执行内部连接w.r.t fips代码 这是我的代码: slider = alt.binding_range(min=2006, max=2012, step=1) select_year = alt.selection_single(name="year", fields=

我正在尝试为我的choropleth绘图添加一个滑块
滑块基于从2006年到2012年的“年数”
我的数据如下:

可从此处下载:

当我绘制县级choropleth时,它正在使用transform_lookup为county执行内部连接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
)

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


正确的是,查找转换只查找第一个匹配索引-它是单边连接,而不是多连接。如果希望每个键连接多个数据项,则必须使用具有多列的数据集

对于您的数据,可以使用pandas方法生成这样的数据集,然后在Altair中使用

对于您的数据,它可能如下所示:

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
)

我正在使用您的方法,但我无法做到这一点。我已经按照要求分享了数据。用数据更新了答案-问题是我假设年份列是字符串。