Vega-Lite представляет собой декларативный высокоуровневый язык описания визуализаций, который транслируется в низкоуровневую спецификацию Vega. Vega, в свою очередь, описывает графику через граф состояний данных, масштабов, сигналов и рендеринговых примитивов. Просмотр скомпилированной Vega-спецификации является ключевым этапом отладки, анализа производительности и понимания того, как высокоуровневые абстракции преобразуются в исполняемую визуализацию.
Vega-Lite не выполняется напрямую движком Vega. Перед рендерингом происходит компиляция:
Компилятор выполняет несколько преобразований:
Результатом является полноценный JSON-объект Vega, пригодный для
исполнения движком vega.View.
В JavaScript среде компиляция осуществляется через пакет
vega-lite.
import vegaLite from 'vega-lite';
const vlSpec = {
data: { values: [1, 2, 3, 4, 5] },
mark: "bar",
encoding: {
x: { field: "data", type: "quantitative", aggregate: "count" }
}
};
const compiled = vegaLite.compile(vlSpec);
const vgSpec = compiled.spec;
Результатом является объект Vega-спецификации, содержащий:
data с трансформированными источникамиmarks с развернутыми примитивамиscales, axes, legendssignals для взаимодействийСкомпилированная Vega-структура значительно более многословна, чем исходный Vega-Lite:
Vega превращает все преобразования данных в последовательность узлов:
source_0 — исходные данныеdata_0_transform — агрегирование, фильтрацияdata_1 — промежуточные наборыКаждый этап становится отдельным объектом в data[].
Vega-Lite задаёт масштаб декларативно:
"x": { "type": "quantitative" }
Vega-компилятор разворачивает это в:
Простой mark Vega-Lite:
"mark": "bar"
Превращается в структуру Vega:
type: "rect"encodeДля рендеринга используется vega пакет.
import { View, parse } from 'vega';
const runtime = parse(vgSpec);
const view = new View(runtime)
.renderer('canvas')
.initialize('#vis');
view.runAsync();
Здесь происходит:
Отдельный сценарий — визуализация именно результата компиляции Vega-Lite, а не исходного уровня.
import vegaLite from 'vega-lite';
import * as vega from 'vega';
const vlSpec = {
data: { values: [10, 20, 30, 40] },
mark: "line",
encoding: {
x: { field: "x", type: "quantitative" },
y: { field: "y", type: "quantitative" }
}
};
// Компиляция
const vgSpec = vegaLite.compile(vlSpec).spec;
// Рендеринг Vega
const runtime = vega.parse(vgSpec);
new vega.View(runtime)
.renderer('canvas')
.initialize(document.body)
.run();
Библиотека vega-embed поддерживает автоматическую
компиляцию Vega-Lite и возможность доступа к результату Vega.
import embed from 'vega-embed';
const vlSpec = {
mark: "area",
encoding: {
x: { field: "year", type: "temporal" },
y: { field: "value", type: "quantitative" }
},
data: { values: [] }
};
embed('#vis', vlSpec, {
mode: 'vega-lite'
}).then(result => {
const compiledVegaSpec = result.spec;
});
В объекте result содержится:
view — экземпляр Vega Viewspec — итоговая Vega-спецификацияvgSpec или аналогичные поля (в зависимости от
версии)Просмотр итогового Vega JSON используется для анализа:
Скомпилированная Vega-спецификация является обычным JSON и может быть сериализована:
const json = JSON.stringify(vgSpec, null, 2);
Такой JSON часто сохраняется для:
После компиляции Vega-спецификация становится входом для runtime:
parse() создаёт внутреннее представлениеView управляет состоянием исполненияИнтерактивность Vega-Lite (selection, hover, brush) трансформируется в Vega следующим образом:
Пример:
"selection": {
"brush": { "type": "interval" }
}
Компилятор генерирует:
Скомпилированная Vega-спецификация обычно:
formula,
collect, project)Компиляция и просмотр Vega возможны вне браузера:
import vegaLite from 'vega-lite';
import vega from 'vega';
import fs from 'fs';
const vgSpec = vegaLite.compile(vlSpec).spec;
const view = new vega.View(vega.parse(vgSpec));
view.toImageURL('png').then(url => {
const base64 = url;
});
Это позволяет:
Промежуточный результат компиляции служит связующим звеном между:
Анализ этого слоя позволяет точно понимать: