В декларативной визуализации на базе Vega-Lite и низкоуровневой
системы Vega ключевую роль в управлении отображением данных играет блок
encode. Он определяет, как данные связываются с визуальными
свойствами графических примитивов (marks) и как эти свойства изменяются
на разных стадиях жизненного цикла элементов сцены.
encode представляет собой словарь каналов визуализации,
где каждый канал (например, x, y,
fill, opacity, size,
text) содержит набор состояний. Эти состояния соответствуют
фазам существования графического элемента:
enterupdateexithoverКаждое состояние описывает набор свойств, которые должны быть применены к элементу в конкретный момент его жизненного цикла.
Базовая идея заключается в том, что каждый mark в сцене рассматривается как объект с динамическим состоянием, а не как статический SVG/Canvas элемент.
Графический элемент в Vega проходит через несколько фаз:
Каждая фаза может задавать собственные значения визуальных атрибутов, которые затем интерполируются системой рендеринга.
Блок enter определяет начальные значения при создании
элемента. Он используется для задания стартовых параметров, которые
часто не совпадают с финальным состоянием.
Типичные свойства:
x, y)opacity)scale)Пример:
"encode": {
"enter": {
"x": {"value": 0},
"y": {"value": 0},
"opacity": {"value": 0}
}
}
Такой подход позволяет создавать плавные появления через анимацию
перехода в update.
enter часто используется как отправная точка
интерполяции. Система автоматически вычисляет переход к состоянию
update, если оно задано.
При отсутствии enter система использует значения по
умолчанию, что делает поведение менее контролируемым.
Блок update описывает целевое состояние элемента при
наличии данных. Это наиболее важная часть encode, так как
именно она отражает актуальную визуализацию.
В update обычно определяются:
field,
scale)fill, stroke)width, height,
radius)Пример:
"encode": {
"update": {
"x": {"scale": "xscale", "field": "value"},
"y": {"scale": "yscale", "field": "category"},
"fill": {"value": "steelblue"}
}
}
В update активно используется привязка к данным
через:
field — ссылка на поле данныхscale — преобразование значения через шкалуЭто делает систему декларативной и отделяет данные от визуального представления.
Если update определён, он всегда переопределяет
enter после первичного создания объекта. Таким образом,
enter можно рассматривать как временное начальное
состояние.
Блок exit определяет поведение элемента при удалении из
сцены. Он критически важен для анимации удаления данных (например, при
фильтрации или обновлении набора данных).
Типичные свойства:
Пример:
"encode": {
"exit": {
"opacity": {"value": 0},
"y": {"value": 200}
}
}
В Vega-Lite удаление данных в визуализации приводит к генерации transition-сценария:
exitexit синхронизируется с остальными переходами, чтобы
избежать резких исчезновений. Система интерполирует значения между
update и exit.
Блок hover активируется при наведении курсора на
элемент. Он используется для временного изменения визуального
представления без изменения данных.
Типичные применения:
Пример:
"encode": {
"hover": {
"fill": {"value": "orange"},
"strokeWidth": {"value": 2}
}
}
hover имеет более высокий приоритет, чем
update, но только в пределах активного взаимодействия.
После ухода курсора система возвращает элемент в состояние
update.
В более сложных схемах hover может быть связан с
сигналами (signals), которые управляют глобальным состоянием сцены:
При одновременном определении всех блоков применяется следующая приоритетность:
hover (временное взаимодействие)update (основное состояние)enter (инициализация)exit (завершение)Эта иерархия обеспечивает предсказуемое поведение визуальных элементов.
Система Vega автоматически выполняет интерполяцию значений между состояниями:
Пример перехода:
"enter": { "opacity": {"value": 0} },
"update": { "opacity": {"value": 1} }
Такой код создаёт плавное появление элемента.
Каждое свойство может содержать выражения:
"fill": {
"expr": "datum.value > 10 ? 'red' : 'blue'"
}
Это позволяет внедрять логику прямо в декларацию визуализации без внешнего кода.
В реальных визуализациях все четыре блока часто комбинируются:
enter задаёт стартовую анимацию появленияupdate определяет основное положение данныхhover усиливает интерактивностьexit обеспечивает мягкое удаление"encode": {
"enter": {
"opacity": {"value": 0}
},
"update": {
"x": {"scale": "xscale", "field": "value"},
"y": {"scale": "yscale", "field": "category"},
"opacity": {"value": 1}
},
"hover": {
"fill": {"value": "gold"}
},
"exit": {
"opacity": {"value": 0}
}
}
При обновлении набора данных система выполняет дифференциацию:
enterupdateexitТакой механизм обеспечивает согласованную синхронизацию визуализации с источником данных без ручного управления DOM.
Блок encode выступает связующим звеном между:
Он позволяет описывать сложные динамические визуализации в компактной форме, сохраняя при этом строгую структуру состояний и предсказуемую модель поведения графических объектов.