Поле values: явные элементы

В Vega и Vega-Lite поле values используется для определения данных непосредственно внутри спецификации визуализации. Оно задаёт явный массив объектов, каждый из которых представляет отдельную запись набора данных. Такой подход исключает необходимость внешнего источника данных (URL, CSV-файла или таблицы данных), позволяя полностью инкапсулировать данные внутри JSON-описания графика.

Структура поля values

Базовая форма использования values в Vega-Lite выглядит как массив объектов:

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

Каждый объект в массиве представляет строку данных. Поля внутри объектов произвольны и определяются структурой визуализации.

Ключевая особенность:

  • данные полностью статичны
  • не требуют загрузки
  • интерпретируются как встроенный dataset

Семантика явных данных

values реализует принцип inline dataset, где источник данных является частью декларативной спецификации.

Основные характеристики:

  • Детерминированность — данные фиксированы на момент описания графика
  • Изоляция — отсутствуют внешние зависимости
  • Простота тестирования — визуализация воспроизводима без инфраструктуры загрузки данных
  • Удобство прототипирования — быстрый старт без подготовки датасетов

Типы данных внутри values

В массиве могут использоваться любые JSON-совместимые типы:

  • строки (string)
  • числа (number)
  • булевы значения (boolean)
  • вложенные структуры (object, array)

Пример смешанных типов:

{
  "data": {
    "values": [
      { "label": "Q1", "sales": 1200, "active": true },
      { "label": "Q2", "sales": 900, "active": false },
      { "label": "Q3", "sales": 1500, "active": true }
    ]
  }
}

В Vega-Lite отсутствует жёсткая схема данных — структура определяется использованием полей в encoding и transform.

Использование в визуализациях

Поле values чаще всего применяется в небольших и средних наборах данных: диаграммах, прототипах, демонстрационных графиках.

Пример столбчатой диаграммы:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      { "month": "Jan", "revenue": 35 },
      { "month": "Feb", "revenue": 42 },
      { "month": "Mar", "revenue": 28 },
      { "month": "Apr", "revenue": 55 }
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": { "field": "month", "type": "ordinal" },
    "y": { "field": "revenue", "type": "quantitative" }
  }
}

Здесь values выполняет роль полноценного источника данных, который далее проходит через систему encoding.

Связь с encoding

Данные в values становятся входом для системы визуального кодирования:

  • field в encoding указывает на ключ объекта
  • type определяет интерпретацию значения
  • трансформации применяются поверх массива values

Пример:

"encoding": {
  "x": { "field": "month", "type": "ordinal" },
  "y": { "field": "revenue", "type": "quantitative" }
}

Связь формируется напрямую:

  • month → категориальная ось
  • revenue → количественная ось

Взаимодействие с трансформациями

Несмотря на статичность, values поддерживает полный набор трансформаций Vega-Lite:

  • filter
  • calculate
  • aggregate
  • window
  • sort

Пример с вычисляемым полем:

{
  "data": {
    "values": [
      { "item": "A", "price": 10, "qty": 2 },
      { "item": "B", "price": 5, "qty": 5 }
    ],
    "transform": [
      {
        "calculate": "datum.price * datum.qty",
        "as": "total"
      }
    ]
  }
}

После трансформации каждое значение из values расширяется новым вычисленным полем total.

Особенности вложенных объектов

values допускает сложные структуры данных, включая вложенные массивы:

{
  "data": {
    "values": [
      {
        "id": 1,
        "metrics": { "x": 10, "y": 20 }
      },
      {
        "id": 2,
        "metrics": { "x": 15, "y": 25 }
      }
    ]
  }
}

Доступ к вложенным полям осуществляется через точечную нотацию:

"encoding": {
  "x": { "field": "metrics.x", "type": "quantitative" },
  "y": { "field": "metrics.y", "type": "quantitative" }
}

Ограничения values

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

  • не подходит для больших объёмов данных
  • увеличивает размер спецификации
  • усложняет поддержку при динамических источниках
  • отсутствует потоковая загрузка

При масштабировании обычно заменяется на:

  • url (внешний источник)
  • format (CSV/JSON парсинг)
  • name (data references внутри Vega)

Сравнение с другими источниками данных

Источник Описание Особенности
values встроенный массив статичность, простота
url внешний файл масштабируемость
name ссылка на dataset композиция данных

values занимает нижний уровень сложности и используется как базовый способ определения данных.

Поведение при интерпретации

При обработке Vega-Lite выполняет следующие шаги:

  1. Парсинг массива values
  2. Создание внутреннего dataset
  3. Применение трансформаций
  4. Передача данных в encoding
  5. Рендеринг mark-компонентов

Этот процесс полностью декларативен и не требует императивного кода.

Производные сценарии использования

values особенно характерен для:

  • учебных примеров
  • документации
  • тестовых наборов
  • статических отчётов
  • демонстрационных дашбордов

Пример scatter plot:

{
  "data": {
    "values": [
      { "x": 1, "y": 2 },
      { "x": 2, "y": 3 },
      { "x": 3, "y": 5 },
      { "x": 4, "y": 4 }
    ]
  },
  "mark": "point",
  "encoding": {
    "x": { "field": "x", "type": "quantitative" },
    "y": { "field": "y", "type": "quantitative" }
  }
}

Каждый элемент массива интерпретируется как отдельная точка в пространстве координат.

Интерпретация в Vega (низкоуровневый слой)

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

  • datum.field
  • datum["field"]

Это обеспечивает единый механизм обработки данных независимо от источника.