Стек Vega-Lite → Vega → SVG/Canvas представляет собой слоистую систему, в которой каждый уровень отвечает за строго определённый этап преобразования декларативного описания данных в интерактивную графику.
Ключевая идея архитектуры — разделение ответственности:
Такой подход обеспечивает переносимость, расширяемость и оптимизацию исполнения без изменения пользовательской спецификации.
Vega-Lite задаёт визуализацию в терминах визуальных намерений, а не алгоритмов отрисовки. Спецификация описывает:
Принципиальная особенность уровня — отсутствие описания того, как именно строится графическая сцена. Вместо этого используется декларативная модель:
{
"data": {"url": "data.csv"},
"mark": "bar",
"encoding": {
"x": {"field": "category", "type": "nominal"},
"y": {"field": "value", "type": "quantitative"}
}
}
На этом уровне отсутствуют понятия координатной системы, сцен-графа или отрисовочного backend’а. Vega-Lite работает как компилятор визуальных намерений, а не как рендерер.
Следующий этап — трансляция спецификации Vega-Lite в промежуточный формат Vega.
Этот процесс можно рассматривать как компиляцию из DSL высокого уровня в более низкоуровневый язык визуализации.
Vega-Lite использует сокращённые конструкции:
mark: "bar"encoding.xaggregateКомпилятор преобразует их в:
Если в Vega-Lite шкалы подразумеваются, то в Vega они становятся явными объектами:
Каждое преобразование данных становится узлом графа:
События (hover, click, drag) преобразуются в:
Vega представляет собой реактивный движок визуализации, основанный на dataflow-архитектуре.
Основные сущности:
Визуализация представляется как граф, где:
Каждое изменение данных или сигналов приводит к инкрементальному пересчёту только затронутых узлов.
Signals — это реактивные переменные, управляющие состоянием визуализации:
Signals связываются с графом и могут:
Transforms формируют вычислительное ядро:
Каждый transform — это узел чистой функции в графе вычислений.
Результатом вычисления dataflow является scenegraph — дерево визуальных примитивов:
Scenegraph является промежуточным представлением между логикой и рендерингом.
Финальный этап архитектуры — отрисовка scenegraph на графическом API браузера.
Vega поддерживает два основных backend’а:
SVG представляет сцену как DOM-дерево:
rect → <rect>circle → <circle>text → <text>path → <path>Canvas использует императивное рисование:
context2d;Scenegraph проходит traversal-алгоритм, и каждый узел преобразуется в последовательность команд:
Архитектура формирует строго направленный поток данных:
Vega-Lite
↓ компиляция
Vega (dataflow graph)
↓ execution
Scenegraph
↓ rendering backend
SVG / Canvas
↓ GPU/Browser rendering
Pixels on screen
Каждый уровень выполняет строго ограниченную функцию:
Одной из ключевых особенностей архитектуры является инкрементальное обновление состояния.
При изменении:
не пересчитывается вся визуализация. Вместо этого:
Это позволяет поддерживать интерактивность даже при сложных визуализациях.
Dataflow архитектура Vega предполагает:
Особенно важно при:
Scenegraph вводит важную концепцию:
Это позволяет:
Компилятор выполняет не только синтаксическое преобразование, но и:
Фактически он превращает высокоуровневую спецификацию в исполнимую программу визуализации.
Архитектура стека можно формализовать как систему уровней абстракции:
Эта многоуровневая модель обеспечивает независимость: