Фильтрация строк в Vega и Vega-Lite реализуется как этап трансформации данных, который позволяет ограничивать набор визуализируемых записей на основе логических условий. В архитектуре обеих систем данные проходят последовательный конвейер: загрузка → трансформации → масштабирование → отрисовка. Фильтрация относится к стадии трансформаций и может быть статической или динамической.
В Vega-Lite основной способ фильтрации — использование трансформации
filter. Она применяется к набору данных до построения
визуальных каналов.
{
"data": {
"values": [
{"category": "A", "value": 10},
{"category": "B", "value": 25},
{"category": "A", "value": 7}
]
},
"transform": [
{
"filter": "datum.value > 10"
}
],
"mark": "bar",
"encoding": {
"x": {"field": "category", "type": "nominal"},
"y": {"field": "value", "type": "quantitative"}
}
}
В этом примере каждая строка проходит через предикат
datum.value > 10. Только записи, удовлетворяющие
условию, попадают в дальнейший pipeline.
Фильтры используют выражения, основанные на синтаксисе Vega
Expression Language. Доступ к полям осуществляется через
datum.
Логические операции:
&& — логическое И|| — логическое ИЛИ! — отрицание{
"filter": "datum.value > 10 && datum.category === 'A'"
}
Сравнения:
==, !=>, <, >=,
<=Фильтрация чувствительна к типам данных. Строковые сравнения выполняются строго:
{
"filter": "datum.status == 'active'"
}
Expression language поддерживает набор встроенных функций.
{
"filter": "indexof(datum.name, 'test') >= 0"
}
{
"filter": "includes(['A', 'B', 'C'], datum.category)"
}
{
"filter": "datum.value >= 10 && datum.value <= 50"
}
В Vega-Lite динамическая фильтрация часто реализуется через параметры, позволяющие связывать UI-состояние с данными.
{
"params": [
{
"name": "threshold",
"value": 10
}
],
"transform": [
{
"filter": "datum.value > threshold"
}
]
}
Значение threshold становится сигналом, используемым в
выражении фильтра.
Selection-параметры позволяют строить интерактивные фильтры на основе выделения.
{
"params": [
{
"name": "brush",
"select": "interval"
}
],
"transform": [
{
"filter": "brush.x && datum.value >= brush.x[0] && datum.value <= brush.x[1]"
}
]
}
Здесь фильтрация зависит от диапазона, выбранного пользователем.
{
"params": [
{
"name": "picked",
"select": "point"
}
],
"transform": [
{
"filter": "picked.category ? datum.category === picked.category : true"
}
]
}
Если элемент выбран, отображаются только соответствующие строки.
В Vega фильтрация реализуется через трансформацию filter
внутри data.transform.
{
"data": [
{
"name": "table",
"values": [
{"x": 1},
{"x": 2},
{"x": 3}
],
"transform": [
{
"type": "filter",
"expr": "datum.x > 1"
}
]
}
]
}
Здесь используется поле expr, но семантика идентична
Vega-Lite.
Фильтры можно цеплять последовательно, формируя pipeline предикатов.
{
"transform": [
{
"filter": "datum.value > 0"
},
{
"filter": "datum.category != 'C'"
}
]
}
Каждый этап уменьшает множество данных, и порядок может влиять на производительность.
Expression language поддерживает тернарный оператор:
{
"filter": "datum.type === 'A' ? datum.value > 10 : datum.value > 20"
}
Такие выражения позволяют реализовывать ветвления внутри одного предиката без дополнительной трансформации.
Отсутствующие значения требуют явной обработки:
{
"filter": "datum.value != null && datum.value > 5"
}
Без проверки на null возможны некорректные результаты
или исключение в выражении.
Поддерживаются regex-операции через test:
{
"filter": "test(datum.name, /^A/)"
}
Фильтрация выполняется по совпадению строки с шаблоном.
Фильтрация выполняется до вычисления шкал и отрисовки, поэтому влияет на весь pipeline визуализации.
Ключевые особенности:
filter могут стать узким
местомОптимизация часто сводится к минимизации вычислений внутри expression language и предварительной агрегации данных.
Фильтрация может выполняться до или после агрегации, в зависимости от порядка трансформаций.
{
"transform": [
{
"filter": "datum.value > 0"
},
{
"aggregate": [
{"op": "sum", "field": "value", "as": "total"}
],
"groupby": ["category"]
}
]
}
{
"transform": [
{
"aggregate": [
{"op": "sum", "field": "value", "as": "total"}
],
"groupby": ["category"]
},
{
"filter": "datum.total > 100"
}
]
}
Порядок трансформаций меняет смысл результата.
Часто фильтрация основывается на выражениях, создаваемых через
calculate.
{
"transform": [
{
"calculate": "datum.value * 2",
"as": "scaled"
},
{
"filter": "datum.scaled > 50"
}
]
}
{
"filter": "datum.category === 'B'"
}
{
"filter": "datum.value >= 10 && datum.value <= 100"
}
{
"filter": "includes(['A','C'], datum.category)"
}
{
"filter": "!selected || datum.category === selected.category"
}
Фильтрация является основой реактивных визуализаций, где изменение
состояния параметров немедленно перестраивает набор отображаемых данных.
В Vega-Lite это достигается декларативным связыванием
params и filter, а в Vega — через сигналы и
выражения.
Фильтрация в этом контексте не является отдельной операцией, а становится частью реактивного графа зависимостей, где любое изменение сигнала приводит к пересчёту данных и перерисовке соответствующих mark-слоёв.