Vega и Vega-Lite используют встроенный язык выражений (expression language), который является ключевым механизмом для вычисления производных значений, фильтрации данных, управления визуальными параметрами и построения условной логики внутри спецификаций визуализаций.
Этот язык выражений основан на JavaScript-подобном синтаксисе, но выполняется в изолированной среде Vega runtime, что делает его безопасным и детерминированным в контексте декларативных спецификаций.
Выражения применяются в нескольких ключевых местах:
calculate, filter,
joinaggregate, window)encoding.condition)calculate в Vega-Lite)Базовая сущность выражения — это строка, интерпретируемая как формула:
{
"type": "formula",
"expr": "datum.value * 2 + 10"
}
или в Vega-Lite:
{
"calculate": "datum.value * 2 + 10",
"as": "computedValue"
}
Арифметические операторы применяются к числовым значениям полей данных и сигналов.
| Оператор | Назначение |
|---|---|
+ |
сложение |
- |
вычитание |
* |
умножение |
/ |
деление |
% |
остаток от деления |
** |
возведение в степень |
datum.price * datum.quantity
datum.value / 100
datum.x ** 2 + datum.y ** 2
Приоритет совпадает с математической моделью:
*** / %+ -Пример:
datum.a + datum.b * datum.c
эквивалентно:
datum.a + (datum.b * datum.c)
{
"calculate": "datum.price * datum.quantity",
"as": "total"
}
{
"calculate": "(datum.x - datum.mean) / datum.std",
"as": "zscore"
}
Логические операции используются для построения условий фильтрации и ветвления.
| Оператор | Назначение | ||
|---|---|---|---|
&& |
логическое И | ||
| | |
логическое ИЛИ | ||
! |
отрицание |
datum.value > 10 && datum.value < 100
datum.category == "A" || datum.category == "B"
!(datum.hidden)
!&&||Пример:
datum.a || datum.b && datum.c
эквивалентно:
datum.a || (datum.b && datum.c)
Сравнения возвращают булевы значения и активно используются в фильтрации и условной логике.
| Оператор | Значение |
|---|---|
== |
равенство |
!= |
неравенство |
< |
меньше |
> |
больше |
<= |
меньше или равно |
>= |
больше или равно |
datum.value >= 0
datum.category != "unknown"
datum.score > datum.threshold
В выражениях Vega отсутствует классический JavaScript
if, но используется тернарный оператор и встроенная функция
if.
datum.value > 0 ? "positive" : "negative"
datum.value > 100 ? "high"
: datum.value > 50 ? "medium"
: "low"
if(datum.value > 0, datum.value, 0)
Функция coalesce выбирает первое ненулевое значение:
coalesce(datum.value, 0)
datum.value != null
или
!isNaN(datum.value)
Фильтрация данных является одним из основных сценариев применения логических операторов.
{
"type": "filter",
"expr": "datum.value > 10 && datum.category == 'A'"
}
{
"filter": "datum.value > 10 && datum.category == 'A'"
}
{
"filter": "(datum.value > 10 && datum.value < 50) || datum.priority == 'high'"
}
Логические и арифметические операторы часто используются для динамического изменения визуальных свойств.
{
"mark": "circle",
"encoding": {
"color": {
"condition": {
"test": "datum.value > 0",
"value": "green"
},
"value": "red"
}
}
}
{
"size": {
"condition": {
"test": "datum.value > 100",
"value": 200
},
"value": 50
}
}
Одним из ключевых аспектов является объединение арифметических и логических выражений в единые формулы.
datum.value > 0 ? datum.value / datum.max : 0
datum.value * (datum.value > threshold)
Логическое выражение возвращает 1 или 0,
превращая условие в множитель.
min(max(datum.value, 0), 100)
datum.score > 80 ? "A"
: datum.score > 50 ? "B"
: datum.score > 30 ? "C"
: "D"
(datum.a > 10 && datum.b < 5) || (datum.c == "active" && datum.d >= 100)
datumdatum.value + "10"
результат — конкатенация строки вместо арифметики
datum.value == null
может не учитывать undefined в некоторых контекстах
datum.a || datum.b && datum.c
без скобок поведение может быть неожиданным
В сложных спецификациях выражения часто комбинируются:
Пример комбинированного вычисляемого поля:
{
"calculate": "datum.value > 0 ? datum.value * 1.2 : datum.value * 0.8",
"as": "adjusted"
}
Арифметические и логические операторы формируют основу выразительной системы Vega и Vega-Lite, позволяя описывать поведение визуализаций без императивного кода. В результате визуализация становится функцией данных, где трансформации и условия встроены непосредственно в спецификацию графика.