过滤#

过滤器转换会根据提供的过滤表达式、选择或其他过滤谓词从数据流中移除对象。可以使用 Chart.transform_filter() 方法在图表的顶层添加过滤器。 transform_filter 的参数可以是多种表达式和对象之一

  1. 一个 Vega 表达式,表示为字符串或使用 expr 模块构建

  2. 字段谓词,例如 FieldOneOfPredicateFieldRangePredicateFieldEqualPredicateFieldLTPredicateFieldGTPredicateFieldLTEPredicateFieldGTEPredicate

  3. selection() 创建的选择谓词或对象

  4. 结合上述任意项的逻辑操作数

我们将在以下章节中简要展示每个示例

过滤表达式#

过滤表达式使用 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 的示例,用于选择上面图表中 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

PredicateComposition

filter 属性必须是谓词定义,可以采用以下形式之一

  1. 一个 expression <https://vega.github.io/vega-lite/docs/types.html#expression>__ 字符串,其中 datum 可用于引用当前数据对象。例如, {filter: "datum.b2 > 60"} 将使输出数据仅包含字段 b2 中值大于 60 的项。

  2. 以下 字段谓词 <https://vega.github.io/vega-lite/docs/predicate.html#field-predicate>__ 之一: equal <https://vega.github.io/vega-lite/docs/predicate.html#field-equal-predicate>__ (等于)、 lt <https://vega.github.io/vega-lite/docs/predicate.html#lt-predicate>__ (小于)、 lte <https://vega.github.io/vega-lite/docs/predicate.html#lte-predicate>__ (小于等于)、 gt <https://vega.github.io/vega-lite/docs/predicate.html#gt-predicate>__ (大于)、 gte <https://vega.github.io/vega-lite/docs/predicate.html#gte-predicate>__ (大于等于)、 range <https://vega.github.io/vega-lite/docs/predicate.html#range-predicate>__ (范围)、 oneOf <https://vega.github.io/vega-lite/docs/predicate.html#one-of-predicate>__ (多选一) 或 valid <https://vega.github.io/vega-lite/docs/predicate.html#valid-predicate>__ (有效),

  3. 一个 选择谓词 <https://vega.github.io/vega-lite/docs/predicate.html#selection-predicate>__,定义了数据点应属于的选区名称(或选区的逻辑组合)。

  4. 一个 逻辑组合 <https://vega.github.io/vega-lite/docs/predicate.html#composition>__ 的 (1)、(2) 或 (3)。