1

几周以来,我一直很喜欢使用 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()
)
4

1 回答 1

2

CSV 数据被解析为字符串而不是数字。当您使用滑块选择日期(例如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
)
于 2018-08-18T03:49:55.557 回答