Встроенные данные: inline values

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


Модель данных и роль inline values

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

Ключевые характеристики:

  • данные находятся внутри спецификации графика;
  • отсутствует необходимость во внешних источниках (CSV, JSON-файлы, API);
  • структура строго табличная: массив объектов;
  • поддерживается полная совместимость с трансформациями (filter, calculate, aggregate и др.).

Vega-Lite: data.values

В Vega-Lite встроенные данные задаются следующим образом:

{
  "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" }
  }
}

Структурные особенности:

  • data.values — массив объектов;
  • ключи объектов становятся именами полей;
  • типы данных не объявляются в самих значениях, а выводятся через encoding;
  • порядок элементов массива сохраняется и может влиять на визуализацию.

Vega: values в data.source

В Vega используется схожая концепция, но с более низкоуровневой структурой:

{
  "data": [
    {
      "name": "table",
      "values": [
        { "x": 1, "y": 28 },
        { "x": 2, "y": 55 },
        { "x": 3, "y": 43 }
      ]
    }
  ]
}

Особенности реализации:

  • данные определяются внутри массива data;
  • каждый набор данных имеет уникальное name;
  • values является источником строк таблицы;
  • далее используется ссылка через data: "table" в остальных частях спецификации.

Структура записей inline values

Каждый элемент массива представляет собой объект фиксированной схемы:

{ "field1": "value", "field2": 123, "field3": true }

Типичные формы значений:

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

Использование с encoding

Inline values напрямую связываются с каналами визуализации через encoding.

Пример распределения данных:

"data": {
  "values": [
    { "month": "Jan", "sales": 120 },
    { "month": "Feb", "sales": 150 },
    { "month": "Mar", "sales": 90 }
  ]
},
"encoding": {
  "x": { "field": "month", "type": "ordinal" },
  "y": { "field": "sales", "type": "quantitative" }
}

Поведение системы:

  • каждое поле становится доступным для шкал (scales);
  • значения проходят через систему преобразований типов;
  • визуальные каналы (x, y, color, size) получают прямую привязку к данным.

Inline values и трансформации

Inline dataset может быть обработан без внешних источников.

Фильтрация

"transform": [
  { "filter": "datum.sales > 100" }
]

Вычисляемые поля

"transform": [
  { "calculate": "datum.sales * 1.2", "as": "adjusted" }
]

Агрегация

"transform": [
  {
    "aggregate": [
      { "op": "sum", "field": "sales", "as": "totalSales" }
    ],
    "groupby": ["month"]
  }
]

Inline values при этом ведут себя идентично внешним источникам данных.


Типизация и вывод схемы

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

  • числовые значения → quantitative;
  • строки → nominal или ordinal (в зависимости от контекста);
  • даты (ISO строки) → temporal.

Ошибки типизации часто проявляются только на этапе отрисовки шкал.


Повторное использование inline данных

Inline values имеют ограниченную переиспользуемость:

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

Ограничения встроенных значений

Практические ограничения:

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

Inline values и реактивные сценарии

В связке с JavaScript inline data часто формируется динамически:

const spec = {
  data: {
    values: Array.from({ length: 10 }, (_, i) => ({
      x: i,
      y: i * i
    }))
  },
  mark: "line",
  encoding: {
    x: { field: "x", type: "quantitative" },
    y: { field: "y", type: "quantitative" }
  }
};

Особенности:

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

Inline values в композиции визуализаций

При построении сложных дашбордов inline data используется как:

  • статические справочники;
  • тестовые наборы;
  • локальные подмножества данных;
  • изолированные примеры внутри составных спецификаций.

Комбинации нескольких inline наборов реализуются через множественные data блоки (в Vega) или через datasets и resolve механизмы в расширенных конфигурациях.


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

При увеличении объёма inline values наблюдается:

  • рост времени парсинга JSON;
  • увеличение нагрузки на layout и scale computation;
  • деградация интерактивности;
  • рост потребления памяти в браузере.

Поэтому inline values концептуально ориентированы на малые и средние наборы данных.


Связь с декларативной архитектурой

Inline values усиливают декларативную природу Vega-Lite и Vega:

  • данные становятся частью описания визуализации;
  • отсутствует процедурная загрузка;
  • структура графика полностью самодостаточна;
  • визуализация и данные объединяются в единую спецификацию.