В системе спецификаций визуализации Vega и Vega-Lite условная логика используется для динамического изменения визуальных свойств графиков на основе данных, сигналов и интерактивных событий. Условные выражения формируют основу адаптивной визуализации: цвет, размер, форма, подписи и даже структура графика могут меняться в зависимости от значений данных или состояния интерфейса.
В отличие от классического JavaScript, условная логика в Vega/Vega-Lite реализуется через собственный expression language и декларативные конструкции, что требует строгого понимания контекста выполнения и допустимых операторов.
Условные выражения в Vega/Vega-Lite встречаются в двух основных формах:
Expression language (Vega expressions)
Используется в полях signal, calculate,
transform, encode.update, mark, и
др.
Декларативные условия (Vega-Lite
condition) Используются в высокоуровневой
спецификации Vega-Lite, чаще всего в encoding.
Эти уровни отличаются по синтаксису и возможностям, но концептуально решают одну задачу — ветвление логики отображения.
? : в Vega expressionsТернарный оператор является базовым механизмом условной логики в expression language Vega.
condition ? valueIfTrue : valueIfFalse
{
"type": "circle",
"encode": {
"update": {
"fill": {
"signal": "datum.value > 100 ? 'red' : 'steelblue'"
}
}
}
}
В этом примере:
datum.value > 100 цвет становится краснымТернарный оператор поддерживает каскадные условия, но чрезмерная вложенность ухудшает читаемость.
"fill": {
"signal": "datum.value > 200 ? 'red' : datum.value > 100 ? 'orange' : 'green'"
}
Логика интерпретируется слева направо:
200 → red
100 → orange
if() в Vega
expressionsПомимо тернарного оператора, Vega предоставляет функциональную форму:
if(test, valueIfTrue, valueIfFalse)
{
"type": "text",
"encode": {
"update": {
"text": {
"signal": "if(datum.value > 50, 'High', 'Low')"
}
}
}
}
| Подход | Синтаксис | Особенности |
|---|---|---|
| ternary | a ? b : c |
компактный, но хуже читается при вложенности |
| if() | if(a, b, c) |
более явная структура, удобен в сложных выражениях |
Функциональная форма предпочтительна при генерации сложных вычислений внутри сигналов.
conditionВ Vega-Lite условные выражения чаще выражаются декларативно через
поле condition, что исключает необходимость прямого
написания выражений в большинстве случаев.
"color": {
"condition": {
"test": "datum.value > 100",
"value": "red"
},
"value": "blue"
}
Здесь:
test определяет условиеvalue внутри condition — результат при истинностиvalue — значение по умолчаниюVega-Lite поддерживает массив условий, позволяя реализовать цепочку проверок.
"color": {
"condition": [
{
"test": "datum.value > 200",
"value": "red"
},
{
"test": "datum.value > 100",
"value": "orange"
}
],
"value": "green"
}
Логика выполняется последовательно: первое совпавшее условие применяется.
Условия применимы ко всем основным каналам визуализации:
colorsizeopacityshapetooltiptext"opacity": {
"condition": {
"test": "datum.category === 'A'",
"value": 1
},
"value": 0.3
}
В Vega signals позволяют создавать реактивные состояния, которые затем используются в условных выражениях.
"signals": [
{
"name": "threshold",
"value": 100
}
]
"fill": {
"signal": "datum.value > threshold ? 'red' : 'blue'"
}
Сигналы делают условную логику динамической и управляемой извне.
Условия могут комбинироваться с логическими операторами:
&& — логическое И|| — логическое ИЛИ! — отрицание"signal": "datum.value > 50 && datum.value < 150 ? 'orange' : 'gray'"
Expression language Vega поддерживает встроенные функции, которые часто используются внутри условных конструкций:
isValid(value)inrange(value, min, max)length(array)time() и функции работы с датами"fill": {
"signal": "inrange(datum.value, 50, 100) ? 'yellow' : 'blue'"
}
Условия применяются не только в визуальных свойствах, но и в
вычислениях данных через calculate.
"transform": [
{
"calculate": "datum.value > 100 ? 'high' : 'low'",
"as": "category"
}
]
Это позволяет предварительно классифицировать данные перед рендерингом.
| Возможность | Vega | Vega-Lite |
|---|---|---|
| ternary | да | через expressions |
| if() | да | через expressions |
| condition | ограниченно | основной способ |
| signals | полный контроль | ограниченный доступ |
| декларативные условия | нет | да |
Vega предоставляет более низкоуровневый контроль, тогда как Vega-Lite стремится к декларативному описанию логики с минимальным использованием выражений.
Снижает читаемость и усложняет отладку.
Возврат строк и чисел в одном условии может приводить к неожиданному поведению.
Vega expressions не поддерживают полноценный JavaScript, только ограниченный набор операторов.
В Vega-Lite порядок условий критичен: первое совпадение имеет приоритет.
conditionternaryif()condition array