Vega/Vega-Lite 数据筛选条件(Predicate)详解
2025-07-08 04:52:08作者:劳婵绚Shirley
什么是Predicate
在Vega/Vega-Lite可视化语法中,Predicate(谓词/断言)是一种用于测试数据点是否满足特定条件的表达式。它主要应用在两种场景:
- 在filter transform(过滤转换)中筛选数据
- 在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]}
}
实际应用建议
- 对于简单条件,直接使用Vega表达式最为简洁
- 字段谓词提供了更结构化的条件定义,适合在配置中使用
- 参数谓词是实现交互式过滤的关键
- 逻辑组合可以构建任意复杂的条件逻辑
- 时间字段过滤时,可以结合
timeUnit
进行更灵活的处理
掌握Vega/Vega-Lite中的Predicate用法,能够帮助你更精确地控制数据可视化中的各种过滤和条件渲染场景。