Vega представляет собой декларативную систему описания визуализаций данных, где график задаётся не императивным кодом, а структурированным JSON-описанием. Центральным элементом является спецификация (specification) — объект, который полностью определяет данные, преобразования, масштабирование, визуальные примитивы и интерактивное поведение.
Базовая структура Vega-спецификации строится вокруг нескольких ключевых блоков:
"$schema" — версия схемы Vega"description" — текстовое описание визуализации"width" и "height" — размеры холста"padding" — внутренние отступы"data" — источники данных"scales" — преобразование данных в визуальные
координаты"axes" — оси координат"marks" — графические примитивы"signals" — реактивные переменные
(интерактивность)"legends" — легенды"projections" — географические проекции (для карт)Минимальный пример структуры:
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"width": 400,
"height": 200,
"data": [
{
"name": "table",
"values": [
{"x": 1, "y": 28},
{"x": 2, "y": 55}
]
}
],
"scales": [],
"marks": []
}
Даже минимальная спецификация уже требует определения данных и области отрисовки, но без масштабов и marks визуализация остаётся пустой.
data: источник данных и этапы подготовкиБлок data представляет собой массив источников. Каждый
источник — независимый поток данных, который может:
{
"data": [
{
"name": "sales",
"url": "data/sales.json",
"format": {"type": "json"}
}
]
}
{
"name": "inline",
"values": [
{"category": "A", "value": 30},
{"category": "B", "value": 80}
]
}
Одной из ключевых особенностей Vega является система
transform. Она позволяет описывать обработку данных прямо
внутри спецификации.
Основные типы трансформаций:
filter — фильтрацияcalculate — вычисляемые поляaggregate — агрегацияbin — разбиение числовых диапазоновsort — сортировкаstack — стековые диаграммыfold / pivot — преобразование
структурыПример вычисляемого поля:
{
"data": [
{
"name": "table",
"values": [
{"x": 1, "y": 2},
{"x": 2, "y": 3}
],
"transform": [
{
"type": "formula",
"as": "y2",
"expr": "datum.y * 10"
}
]
}
]
}
{
"type": "aggregate",
"groupby": ["category"],
"fields": ["value"],
"ops": ["sum"],
"as": ["total"]
}
Агрегация формирует новые наборы данных, которые далее используются в масштабах и marks.
scales: преобразование данных в визуальные координатыScales — один из центральных механизмов Vega. Он связывает абстрактные данные с визуальным представлением.
{
"scales": [
{
"name": "xscale",
"type": "band",
"domain": {"data": "table", "field": "category"},
"range": "width"
}
]
}
Пример числовой шкалы:
{
"name": "yscale",
"type": "linear",
"domain": {"data": "table", "field": "value"},
"range": "height"
}
Domain может вычисляться динамически:
axes: координатные
осиAxes отображают визуальную интерпретацию шкал.
{
"axes": [
{
"orient": "bottom",
"scale": "xscale"
},
{
"orient": "left",
"scale": "yscale"
}
]
}
orient — расположение (top, bottom, left, right)scale — связанная шкалаtitle — подпись осиgrid — отображение сеткиtickCount — количество деленийAxes в Vega не являются обязательными, но критичны для интерпретируемых графиков.
marks:
графические примитивыMarks — основной визуальный слой Vega. Именно здесь определяется, как данные превращаются в графические элементы.
rect — прямоугольникиsymbol — точки/символыline — линииarea — областиtext — текстgroup — контейнеры{
"marks": [
{
"type": "rect",
"from": {"data": "table"},
"encode": {
"enter": {
"x": {"scale": "xscale", "field": "category"},
"y": {"scale": "yscale", "field": "value"},
"width": {"scale": "xscale", "band": 1},
"height": {"value": 20}
}
}
}
]
}
encode делится на три стадии:
enter — начальное созданиеupdate — обновлениеexit — удалениеПример обновления цвета:
"update": {
"fill": {"value": "steelblue"}
}
Каждый mark может использовать:
from.data — источник данныхtransform — локальные преобразованияgroup — вложенные структурыsignals:
реактивная системаSignals — механизм реактивного управления состоянием визуализации.
{
"signals": [
{
"name": "threshold",
"value": 50
}
]
}
Signals могут:
Пример привязки к encode:
"opacity": {
"signal": "threshold > datum.value ? 1 : 0.3"
}
Signals могут обновляться событиями:
{
"name": "hovered",
"on": [
{
"events": "rect:mouseover",
"update": "datum"
}
]
}
legends:
легенды визуализацииLegends связывают визуальные переменные с категориями данных.
{
"legends": [
{
"fill": "colorScale",
"title": "Категории"
}
]
}
Legend автоматически извлекает domain шкалы и отображает соответствия.
projections: географические преобразованияИспользуется при создании карт.
{
"projections": [
{
"name": "projection",
"type": "mercator"
}
]
}
Projections применяются к геоданным и связываются с path marks.
Vega-спецификация строится как система взаимосвязанных уровней:
Эта структура обеспечивает строгую декларативную модель, в которой каждый уровень зависит от предыдущего, но не нарушает его инкапсуляцию.
Ключевая особенность Vega — явные связи:
data → scale (домен шкал строится из данных)scale → marks (визуализация опирается на шкалы)signals → data/scales/marks (динамическое
управление)marks → legends (автоматическая генерация легенд)Эти связи формируют граф зависимостей, который Vega использует для реактивного обновления визуализации.
Vega-спецификация фактически является описанием направленного графа вычислений, где:
Это позволяет системе: