Структура спецификации

Спецификация в Vega и Vega-Lite представляет собой декларативное описание визуализации данных, где вся логика построения графика выражается через структурированный JSON-объект. Такой подход исключает императивное управление отрисовкой и переносит ответственность за рендеринг на движок визуализации.

В основе лежит идея описания не процесса построения графика, а его конечного состояния: какие данные используются, как они преобразуются, каким визуальным каналам соответствуют и какие визуальные примитивы применяются.

Иерархия уровней спецификации

Vega-Lite как высокоуровневая абстракция

Vega-Lite задаёт компактную структуру, скрывающую низкоуровневые механизмы Vega. Основные элементы спецификации:

  • источник данных
  • тип графического примитива (mark)
  • правила визуального кодирования (encoding)
  • преобразования данных (transform)
  • параметры масштабирования и осей

Минимальная структура:

{
  "data": { ... },
  "mark": "...",
  "encoding": { ... }
}

Каждый из этих блоков выполняет строго определённую функцию и образует декларативную цепочку преобразования данных в визуальные элементы.

Vega как низкоуровневая система

Vega представляет полную графическую спецификацию, включающую управление сценой, потоками данных и состояниями взаимодействия. В отличие от Vega-Lite, структура Vega более детализирована и включает:

  • dataflow graph (граф потоков данных)
  • сигналы (signals)
  • шкалы (scales)
  • оси и легенды (axes, legends)
  • примитивы отрисовки (marks)
  • проекции (projections)

Базовый каркас Vega:

{
  "data": [],
  "signals": [],
  "scales": [],
  "projections": [],
  "axes": [],
  "legends": [],
  "marks": []
}

Блок данных (data)

Источники данных

Блок данных задаёт входную информацию для визуализации. Поддерживаются различные форматы:

  • inline массивы
  • внешние JSON/CSV источники
  • результаты вычислений transform

Пример inline-структуры:

{
  "data": {
    "values": [
      { "category": "A", "value": 28 },
      { "category": "B", "value": 55 }
    ]
  }
}

Для внешних источников используется URL:

{
  "data": {
    "url": "data.csv",
    "format": { "type": "csv" }
  }
}

Преобразования данных

В Vega-Lite трансформации встроены в спецификацию через transform, в Vega они представляют отдельные узлы dataflow.

Типовые операции:

  • фильтрация
  • агрегация
  • вычисляемые поля
  • группировка
  • сортировка

Пример:

{
  "transform": [
    { "filter": "datum.value > 10" },
    { "calculate": "datum.value * 2", "as": "scaled" }
  ]
}

Блок mark: визуальные примитивы

Типы графических маркеров

Mark определяет способ визуального представления данных:

  • bar — столбцы
  • line — линии
  • area — области
  • point — точки
  • rect — прямоугольники
  • text — текстовые элементы

Пример:

{
  "mark": "bar"
}

Параметризация mark

Mark может быть объектом с дополнительными настройками:

{
  "mark": {
    "type": "line",
    "interpolate": "monotone",
    "strokeWidth": 2
  }
}

Эти параметры определяют визуальное поведение примитивов, не затрагивая данные напрямую.

Encoding: система визуального сопоставления

Каналы визуализации

Encoding связывает данные с визуальными переменными:

  • x, y — координаты
  • color — цвет
  • size — размер
  • shape — форма
  • opacity — прозрачность
  • text — текстовое содержимое

Пример:

{
  "encoding": {
    "x": { "field": "category", "type": "nominal" },
    "y": { "field": "value", "type": "quantitative" }
  }
}

Типы данных в encoding

Vega-Lite требует явного указания типа данных:

  • quantitative — числовые значения
  • nominal — категориальные данные без порядка
  • ordinal — упорядоченные категории
  • temporal — временные значения

Тип данных влияет на выбор шкалы и поведения осей.

Множественные каналы

Один набор данных может быть отображён через несколько каналов одновременно:

{
  "encoding": {
    "x": { "field": "date", "type": "temporal" },
    "y": { "field": "price", "type": "quantitative" },
    "color": { "field": "region", "type": "nominal" }
  }
}

Scale: система преобразования значений

Назначение шкал

Шкалы преобразуют значения данных в координаты или визуальные параметры. Они являются промежуточным слоем между данными и mark.

Типы шкал:

  • linear
  • log
  • ordinal
  • band
  • point
  • time

Пример явного задания:

{
  "scale": {
    "type": "linear",
    "domain": [0, 100],
    "range": [0, 500]
  }
}

Domain и range

  • domain — входные данные
  • range — выходные визуальные значения

Эта пара формирует математическое отображение:

y = f(x)

В контексте Vega это отображение может быть линейным, логарифмическим или категориальным.

Axis: построение координатной структуры

Структура осей

Оси визуализируют шкалы и обеспечивают интерпретацию значений:

{
  "axis": {
    "orient": "bottom",
    "title": "Категория"
  }
}

Связь с encoding

Оси автоматически создаются на основе шкал, привязанных к encoding каналам. В Vega-Lite оси обычно не описываются явно, а генерируются системой.

Legend: легенды отображения

Назначение

Легенды отображают соответствие между визуальными свойствами и данными.

Пример:

{
  "legend": {
    "title": "Регион"
  }
}

Типы легенд

  • цветовые
  • размерные
  • формовые

Каждая легенда связана с конкретным encoding каналом.

Transform: промежуточная обработка данных

Основные операции

Transform блок позволяет изменять данные перед визуализацией:

  • filter
  • aggregate
  • bin
  • calculate
  • sort

Пример агрегации:

{
  "transform": [
    {
      "aggregate": [
        { "op": "mean", "field": "value", "as": "avgValue" }
      ],
      "groupby": ["category"]
    }
  ]
}

Биннинг данных

Биннинг используется для дискретизации числовых данных:

{
  "transform": [
    {
      "bin": true,
      "field": "value",
      "as": "binnedValue"
    }
  ]
}

Сигналы в Vega

Механизм реактивности

Signals представляют динамические значения, изменяющиеся при взаимодействии пользователя.

{
  "signals": [
    {
      "name": "width",
      "value": 400
    }
  ]
}

Интерактивные зависимости

Signals позволяют связывать параметры визуализации с событиями:

  • мышь
  • клавиатура
  • zoom/pan
  • selection

Сигналы формируют реактивную модель состояния.

Marks в Vega

Структура mark-узла

В Vega marks являются частью dataflow графа:

{
  "type": "rect",
  "from": { "data": "table" },
  "encode": {
    "enter": { ... },
    "update": { ... }
  }
}

Фазы рендеринга

  • enter — создание элементов
  • update — обновление состояния
  • exit — удаление элементов

Эта модель обеспечивает эффективное обновление визуализации без полной перерисовки.

Проекции и координатные преобразования

Назначение projections

Projections используются в географических визуализациях для преобразования координат:

{
  "projections": [
    {
      "type": "mercator"
    }
  ]
}

Геоданные

Проекции позволяют отображать:

  • карты
  • географические распределения
  • пространственные наборы данных

Компоновка визуализаций

Layout система

Vega поддерживает вложенные визуализации и компоновку:

  • facet (разбиение по категориям)
  • concat (последовательное соединение)
  • layer (наложение слоёв)

Пример слоя:

{
  "layer": [
    { "mark": "line" },
    { "mark": "point" }
  ]
}

Facet-структуры

Facet разбивает данные на подграфики:

{
  "facet": {
    "row": { "field": "region" }
  }
}

Каждая панель представляет отдельный поднабор данных.

Полная структура Vega-Lite

Итоговая структура спецификации включает:

  • data
  • transform
  • mark
  • encoding
  • scale (неявно)
  • axis (неявно)
  • legend (неявно)
  • projection (при необходимости)
  • facet/layer/concat

Эта структура формирует декларативный граф преобразования данных в визуальные представления, где каждый блок выполняет строго определённую роль в общей системе отображения.