В основе Vega и Vega-Lite лежит принцип декларативного описания визуализации через JSON-структуру. Вместо пошагового императивного кода, описывающего создание графических примитивов, используется единая спецификация, которая полностью определяет:
Ключевая особенность подхода заключается в том, что спецификация является полным описанием состояния графика, а не набором инструкций для его построения.
Минимальная структура Vega-Lite выглядит следующим образом:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{ "category": "A", "value": 28 },
{ "category": "B", "value": 55 },
{ "category": "C", "value": 43 }
]
},
"mark": "bar",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" }
}
}
Эта структура уже содержит полный цикл преобразования данных в визуальный объект: от массива JSON до отрисованной диаграммы.
Vega-Lite представляет собой высокоуровневую абстракцию над Vega. Основная идея заключается в разделении ответственности:
Внутренне Vega-Lite компилирует спецификацию в низкоуровневый Vega-документ, который уже интерпретируется движком визуализации.
Такой подход формирует многоуровневую модель:
Любая спецификация начинается с блока данных. Vega-Lite поддерживает несколько источников:
values)url)Пример загрузки внешнего набора:
{
"data": {
"url": "data/cars.json"
}
}
Данные в Vega-Lite считаются неизменяемыми в момент рендеринга, а
любые преобразования описываются декларативно через
transform.
Поле mark определяет тип графического представления. Это
фундаментальный элемент, задающий семантику визуализации.
Основные типы марок:
bar — столбчатые диаграммыline — линейные графикиpoint — точечные диаграммыarea — площадные графикиtext — текстовые аннотацииrect — прямоугольные областиКаждая марка задаёт базовую геометрию, которая затем параметризуется через encoding.
Пример линейного графика:
{
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "temperature", "type": "quantitative" }
}
}
Encoding представляет собой центральный механизм трансформации данных в графику. Он определяет, какие поля данных соответствуют визуальным каналам.
Основные каналы:
x, y — координатыcolor — цветовое кодированиеsize — размерshape — формаopacity — прозрачностьtooltip — интерактивные подсказкиПример многоканального отображения:
{
"mark": "point",
"encoding": {
"x": { "field": "horsepower", "type": "quantitative" },
"y": { "field": "mpg", "type": "quantitative" },
"color": { "field": "origin", "type": "nominal" },
"size": { "field": "weight", "type": "quantitative" }
}
}
Каждый канал работает как функция отображения данных в визуальное пространство.
Vega-Lite использует строгую систему типов данных, которая влияет на выбор шкал и преобразований:
quantitative — числовые значенияtemporal — временные рядыordinal — упорядоченные категорииnominal — неупорядоченные категорииТип данных определяет поведение шкал (scales), осей (axes) и агрегирующих функций.
Например, временной тип автоматически приводит к построению временной шкалы с корректной интерполяцией дат.
Каждый визуальный канал проходит через функцию масштабирования. Vega-Lite автоматически создаёт шкалы, но допускает их явную настройку.
Пример ручной настройки шкалы:
{
"encoding": {
"y": {
"field": "value",
"type": "quantitative",
"scale": { "domain": [0, 100], "nice": true }
}
}
}
Шкалы выполняют преобразование из домена данных в диапазон пикселей.
Блок transform позволяет модифицировать данные до
рендеринга. Поддерживаются:
Пример агрегации:
{
"transform": [
{
"aggregate": [
{ "op": "mean", "field": "value", "as": "avgValue" }
],
"groupby": ["category"]
}
]
}
Такие операции позволяют формировать новые представления без изменения исходного набора данных.
Процесс преобразования спецификации включает несколько этапов:
Результатом является чистая Vega-спецификация, которая уже не содержит высокоуровневых сокращений.
Рассмотрим полный конвейер:
{
"data": {
"values": [
{ "x": 1, "y": 3 },
{ "x": 2, "y": 5 },
{ "x": 3, "y": 2 }
]
},
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" }
}
}
Этот JSON проходит следующие стадии:
Декларативная модель Vega-Lite устраняет необходимость управления графическим состоянием напрямую. Вместо этого система оперирует:
Это приводит к тому, что один и тот же JSON может быть детерминированно преобразован в визуализацию независимо от среды выполнения.
Vega-Lite используется как библиотека спецификаций, но рендеринг выполняется через JavaScript API:
vegaEmbed('#vis', spec);
В этом случае спецификация остаётся неизменной, а JavaScript выполняет роль хоста для визуального движка.
Связь между слоями:
Vega-Lite поддерживает составные визуализации:
Пример наложения слоёв:
{
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y1", "type": "quantitative" }
}
},
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y2", "type": "quantitative" }
}
}
]
}
Использование JSON как основного носителя описания визуализации создаёт унифицированный формат, который:
Это делает Vega-Lite не просто библиотекой, а формальной системой описания графиков, основанной на строгой структуре данных и трансформаций.