首页
/ Vega/Vega-Lite 数据筛选条件(Predicate)详解

Vega/Vega-Lite 数据筛选条件(Predicate)详解

2025-07-08 04:52:08作者:劳婵绚Shirley

什么是Predicate

在Vega/Vega-Lite可视化语法中,Predicate(谓词/断言)是一种用于测试数据点是否满足特定条件的表达式。它主要应用在两种场景:

  1. 在filter transform(过滤转换)中筛选数据
  2. 在conditional encoding(条件编码)的test属性中判断条件

Predicate提供了多种灵活的方式来定义数据筛选条件,让开发者能够精确控制哪些数据应该被包含或排除。

Predicate的四种基本形式

1. Vega表达式字符串

可以直接使用Vega表达式字符串作为Predicate,其中datum关键字用于引用当前数据对象。

示例

"datum.b2 > 60"  // 检查b2字段值是否大于60

2. 字段谓词(Field Predicate)

通过指定字段名和比较条件来测试数据字段。支持以下比较操作:

  • equal:等于
  • lt:小于
  • lte:小于等于
  • gt:大于
  • gte:大于等于
  • range:在范围内
  • oneOf:在指定值列表中
  • valid:是否为有效值

3. 参数谓词(Parameter Predicate)

基于交互选择(selection)来过滤数据。只需提供参数名即可。

示例

{"param": "brush"}  // 只保留在名为"brush"的选择范围内的数据

4. 逻辑组合(Composition)

使用逻辑运算符(and, or, not)组合多个Predicate。

字段谓词详解

字段谓词是最常用的Predicate类型,它允许我们对数据中的特定字段进行条件测试。

基本结构

所有字段谓词都包含field属性指定要测试的字段,并可选的包含timeUnit属性对时间字段进行转换。

{
  "field": "字段名",
  "timeUnit": "时间单位",  // 可选
  // 比较操作符...
}

各种比较操作符

equal - 等于

测试字段值是否等于指定值。

{"field": "car_color", "equal": "red"}

lt/lte - 小于/小于等于

测试数值或字符串的大小关系。

{"field": "height", "lt": 180}  // 高度小于180
{"field": "Year", "lte": "2000"}  // 年份小于等于2000

gt/gte - 大于/大于等于

与lt/lte类似,测试大于关系。

{"field": "state", "gt": "Arizona"}  // 州名字母顺序在Arizona之后
{"field": "height", "gte": 0}  // 高度大于等于0

range - 范围测试

测试字段值是否在指定范围内(闭区间)。

{"field": "x", "range": [0, 5]}  // 0 ≤ x ≤ 5
{"field": "date", "range": [{"year": 2006}, {"year": 2008}]}  // 2006到2008年间

oneOf - 多值匹配

测试字段值是否在指定值列表中。

{"field": "car_color", "oneOf": ["red", "yellow"]}

valid - 有效性测试

测试字段值是否有效(非null且非NaN)。

{"field": "car_color", "valid": true}

参数谓词与交互选择

参数谓词将数据过滤与用户交互绑定,是实现动态可视化的强大工具。

{"param": "brush", "empty": false}
  • param:指定选择名称
  • empty:当选择为空时的行为,默认为true(包含所有数据),设为false则空选择时不包含任何数据

使用技巧:当使用选择过滤动态改变数据时,为防止坐标轴范围跳动影响标题位置,可以设置轴的minExtent属性固定最小范围。

逻辑组合谓词

通过逻辑运算符可以构建更复杂的条件。

AND组合

{
  "and": [
    {"field": "height", "gt": 0},
    {"field": "height", "lt": 180}
  ]
}

OR组合

{
  "or": [
    {"field": "age", "lt": 18},
    {"field": "age", "gt": 65}
  ]
}

NOT否定

{
  "not": {"field": "x", "range": [0, 5]}
}

实际应用建议

  1. 对于简单条件,直接使用Vega表达式最为简洁
  2. 字段谓词提供了更结构化的条件定义,适合在配置中使用
  3. 参数谓词是实现交互式过滤的关键
  4. 逻辑组合可以构建任意复杂的条件逻辑
  5. 时间字段过滤时,可以结合timeUnit进行更灵活的处理

掌握Vega/Vega-Lite中的Predicate用法,能够帮助你更精确地控制数据可视化中的各种过滤和条件渲染场景。