Условное кодирование в Vega-Lite используется для динамического
изменения визуальных свойств элементов графика в зависимости от данных,
выражений или состояния взаимодействия. Поле condition
является частью декларативной системы encoding и позволяет
задавать альтернативные значения для одного визуального канала.
Основная идея заключается в разделении отображения на две ветви:
Такой подход обеспечивает компактность спецификации и устраняет необходимость ручной фильтрации данных или создания дополнительных слоёв исключительно ради визуальной дифференциации.
conditionОбобщённая форма условного кодирования выглядит следующим образом:
{
"encoding": {
"color": {
"condition": {
"test": "datum.value > 10",
"value": "red"
},
"value": "blue"
}
}
}
Здесь:
condition описывает правилоtest задаёт логическое выражениеvalue определяет результат при истинности условияvalue работает как значение по умолчаниюТакая конструкция применяется ко всем каналам: color,
size, shape, opacity,
tooltip, stroke, fill и
другим.
testНаиболее прямолинейный вариант — использование выражений Vega
Expression Language. Эти выражения работают в контексте
datum.
Пример изменения цвета точек в зависимости от значения:
{
"mark": "point",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" },
"color": {
"condition": {
"test": "datum.y > 50",
"value": "red"
},
"value": "steelblue"
}
}
}
Здесь все точки, у которых y > 50, окрашиваются в
красный цвет, остальные — в синий.
condition может быть массивом условий. В этом случае
применяется первое совпавшее правило.
{
"color": {
"condition": [
{
"test": "datum.value > 80",
"value": "red"
},
{
"test": "datum.value > 50",
"value": "orange"
}
],
"value": "green"
}
}
Логика выполнения:
value по
умолчаниюТакая структура позволяет реализовать ступенчатую классификацию без предварительной обработки данных.
Вместо выражений можно использовать сравнение через встроенные механизмы трансформации Vega-Lite:
{
"color": {
"condition": {
"field": "category",
"equal": "A",
"value": "red"
},
"value": "gray"
}
}
Поддерживаются операторы:
equalrangelt, ltegt, gteoneOfПример диапазонного условия:
{
"color": {
"condition": {
"field": "score",
"range": [70, 100],
"value": "green"
},
"value": "red"
}
}
Такой подход делает спецификацию более декларативной и снижает зависимость от выражений.
Одно из наиболее мощных применений condition связано с
интерактивными выделениями (selection). В этом случае
визуальное состояние зависит от пользовательского действия.
{
"selection": {
"brush": {
"type": "interval"
}
},
"mark": "point",
"encoding": {
"color": {
"condition": {
"selection": "brush",
"value": "orange"
},
"value": "lightgray"
}
}
}
Здесь элементы, попадающие в область выделения brush,
получают альтернативный цвет.
Механизм selection-кондиций лежит в основе:
condition с другими каналамиcondition не ограничен цветом. Он одинаково работает с
любыми визуальными каналами.
{
"size": {
"condition": {
"test": "datum.importance > 5",
"value": 200
},
"value": 50
}
}
{
"shape": {
"condition": {
"test": "datum.type === 'critical'",
"value": "triangle"
},
"value": "circle"
}
}
{
"opacity": {
"condition": {
"test": "datum.hidden === true",
"value": 0.2
},
"value": 1
}
}
Для более сложной логики используются выражения Vega Expression Language:
{
"color": {
"condition": {
"test": "datum.a > 10 && datum.b < 5",
"value": "purple"
},
"value": "steelblue"
}
}
Допускается использование функций:
{
"test": "isValid(datum.value) && datum.value > mean"
}
Такие конструкции позволяют реализовывать поведение, близкое к вычисляемым полям, но без изменения исходного набора данных.
condition в
контексте слоя (layered charts)В многослойных графиках условное кодирование часто применяется для выделения подмножеств данных в одном слое.
{
"layer": [
{
"mark": "point",
"encoding": {
"color": {
"condition": {
"test": "datum.group === 'A'",
"value": "red"
},
"value": "gray"
}
}
}
]
}
В этом случае один слой визуально разделяет группы данных без необходимости создания отдельных наборов данных.
При интерпретации condition действует строгий
порядок:
test, field,
selection)value условияВажно, что condition полностью перекрывает стандартное
значение канала при срабатывании.
condition в Vega-Lite и VegaВ Vega-Lite condition является декларативной
абстракцией, которая компилируется в более низкоуровневые конструкции
Vega.
В Vega (низкоуровневом языке) аналогичное поведение реализуется через:
signal-выраженияif-then-else конструкции в encodetest)Пример Vega-уровня:
{
"encode": {
"update": {
"fill": {
"signal": "datum.value > 10 ? 'red' : 'blue'"
}
}
}
}
Vega-Lite скрывает эту сложность, предоставляя единый
condition.
conditionРаспространённые проблемы связаны не с синтаксисом, а с логикой:
value, приводящее к неопределённому
отображениюtest, ухудшающие
читаемостьcondition
перекрывают друг другаcondition вместо агрегации или
трансформацийОсобенно важно учитывать, что condition работает на
уровне визуализации, а не на уровне структуры данных.
Условное кодирование формирует основу адаптивных визуализаций, где один и тот же график может одновременно:
За счёт этого Vega-Lite позволяет строить выразительные визуализации без перехода к императивной логике или ручной отрисовке элементов.