过滤#
过滤器转换会根据提供的过滤表达式、选择或其他过滤谓词从数据流中移除对象。可以使用 Chart.transform_filter()
方法在图表的顶层添加过滤器。 transform_filter
的参数可以是多种表达式和对象之一
一个 Vega 表达式,表示为字符串或使用
expr
模块构建字段谓词,例如
FieldOneOfPredicate
、FieldRangePredicate
、FieldEqualPredicate
、FieldLTPredicate
、FieldGTPredicate
、FieldLTEPredicate
、FieldGTEPredicate
,由
selection()
创建的选择谓词或对象结合上述任意项的逻辑操作数
我们将在以下章节中简要展示每个示例
过滤表达式#
过滤表达式使用 Vega 表达式 语言,可以直接指定为字符串,或使用 expr
模块构建。当例如,仅选择数据的一个子集时,这会很有用。
例如
import altair as alt
from altair import datum
from vega_datasets import data
pop = data.population.url
alt.Chart(pop).mark_area().encode(
x='age:O',
y='people:Q',
).transform_filter(
(datum.year == 2000) & (datum.sex == 1)
)
请注意,与 过滤 中一样,数据值通过名称 datum
引用。
字段谓词#
字段谓词的功能与表达式谓词有些重叠,但其优点是内容经过模式验证。示例如下
FieldEqualPredicate
评估字段是否等于特定值FieldOneOfPredicate
评估字段是否在一系列指定值中。FieldRangePredicate
评估连续字段是否在值范围内。FieldLTPredicate
评估连续字段是否小于给定值FieldGTPredicate
评估连续字段是否大于给定值FieldLTEPredicate
评估连续字段是否小于或等于给定值FieldGTEPredicate
评估连续字段是否大于或等于给定值
这里是一个 FieldEqualPredicate
的示例,用于选择上面图表中 2000 年的数据
import altair as alt
from vega_datasets import data
pop = data.population.url
alt.Chart(pop).mark_line().encode(
x='age:O',
y='sum(people):Q',
color='year:O'
).transform_filter(
alt.FieldEqualPredicate(field='year', equal=2000)
)
一个 FieldOneOfPredicate
类似,但允许选择任意数量的特定值
import altair as alt
from vega_datasets import data
pop = data.population.url
alt.Chart(pop).mark_line().encode(
x='age:O',
y='sum(people):Q',
color='year:O'
).transform_filter(
alt.FieldOneOfPredicate(field='year', oneOf=[1900, 1950, 2000])
)
最后,一个 FieldRangePredicate()
允许选择特定连续范围内的值
import altair as alt
from vega_datasets import data
pop = data.population.url
alt.Chart(pop).mark_line().encode(
x='age:O',
y='sum(people):Q',
color='year:O'
).transform_filter(
alt.FieldRangePredicate(field='year', range=[1960, 2000])
)
选择谓词#
选择谓词可用于根据选择过滤数据。虽然可以直接使用 SelectionPredicate
类构建它们,但在 Altair 中,使用 selection()
函数构建它们通常更方便。例如,此图表使用多选功能,允许用户点击或 shift+点击底部图表中的条形,以选择要在顶部图表中显示的数据
import altair as alt
from vega_datasets import data
pop = data.population.url
selection = alt.selection_point(fields=['year'])
top = alt.Chart(width=600, height=200).mark_line().encode(
x="age:O",
y="sum(people):Q",
color="year:O"
).transform_filter(
selection
)
color = alt.when(selection).then(alt.value("steelblue")).otherwise(alt.value("lightgray"))
bottom = alt.Chart(width=600, height=100).mark_bar().encode(
x="year:O",
y="sum(people):Q",
color=color
).add_params(
selection
)
alt.vconcat(top, bottom, data=pop)
逻辑操作数#
有时,将几种类型的谓词组合成一个选择会很有用。我们可以分别使用 &
、 |
和 ~
来表示 AND
(与)、 OR
(或) 和 NOT
(非) 逻辑组合操作数。
例如,这里我们希望绘制美国人口分布,但不包括 1950-1960 年的数据。
首先,我们使用一个 FieldRangePredicate
来选择 1950-1960 年
import altair as alt
from vega_datasets import data
source = data.population.url
chart = alt.Chart(source).mark_line().encode(
x="age:O",
y="sum(people):Q",
color="year:O"
).properties(
width=600, height=200
)
between_1950_60 = alt.FieldRangePredicate(field="year", range=[1950, 1960])
然后,我们可以使用 ~
来 反转 这个选择
# NOT between 1950-1960
chart.transform_filter(~between_1950_60)
我们可以通过将多个谓词 组合 起来进一步细化过滤器。在这种情况下,使用 datum
chart.transform_filter(~between_1950_60 & (datum.age <= 70))
当传递多个谓词时,它们将通过 &
进行合并
chart.transform_filter(datum.year > 1980, datum.age != 90)
使用关键字参数 constraints
可以简化我们在 过滤表达式 中的第一个示例
alt.Chart(source).mark_area().encode(
x="age:O",
y="people:Q",
).transform_filter(year=2000, sex=1)
转换选项#
transform_filter()
方法基于 FilterTransform
类构建,该类具有以下选项
点击显示表格
属性 |
类型 |
描述 |
---|---|---|
filter |
|