Altair 滑块变换数据

Altair slider transform data

几周来我一直很喜欢使用 Altair,但我对如何解决问题感到困惑。我一直在尝试绘制一个简单的平均温度数据与月份的关系图,并使用滑块小部件来过滤这些年来的数据。我可以让绘图工作,但只要我使用滑块选项,它就不会显示任何数据。我尝试只使用选择选项,但没有用。我只是不知道如何处理转换选项。我使用随时间变化的美国人口 示例作为指南。

import altair as alt
from altair.expr import datum, if_
alt.renderers.enable('notebook')
path = 'https://raw.githubusercontent.com/SpiritR/datpr6754/master/prtas_1901_2015.csv'


slider = alt.binding_range(min=1900, max=2020, step=10)
year = alt.selection_single(name="year", fields=['Year'], bind=slider)

alt.Chart(path).mark_bar().encode(
    alt.X('Month_Name:O'),
    alt.Y('tas:Q', scale=alt.Scale(domain=(20, 28))),
).properties(
    width=900,
    height=300,
).add_selection(
    year
).transform_calculate(
   ????
).transform_filter(
    year.ref()
)

CSV 数据被解析为字符串而不是数字。当您使用滑块 select 一个日期(例如 1959)时,它会过滤数据以检查哪些值等于该日期...并且由于数据是字符串,"1959" != 1959 和结果子集为空。

您可以强制将列解析为数字,然后滑块将正常工作。例如:

import altair as alt
alt.renderers.enable('notebook')

path = 'https://raw.githubusercontent.com/SpiritR/datpr6754/master/prtas_1901_2015.csv'
data = alt.UrlData(url=path, format=alt.CsvDataFormat(parse={'Year': 'number'}))

slider = alt.binding_range(min=1901, max=2015, step=1)
year = alt.selection_single(name="year", fields=['Year'], bind=slider)

alt.Chart(data).mark_bar().encode(
    alt.X('Month_Name:O'),
    alt.Y('tas:Q', scale=alt.Scale(domain=(20, 28))),
).properties(
    width=900,
    height=300,
).add_selection(
    year
).transform_filter(
    year
)