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

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

Именованный источник данных — это объект данных, которому присвоен идентификатор name. Этот идентификатор используется для последующих обращений внутри спецификации: в преобразованиях, слоях, масштабах и визуальных примитивах.

Ключевая особенность подхода заключается в разделении данных по ролям:

  • исходные наборы данных (raw datasets),
  • промежуточные трансформированные наборы,
  • вспомогательные справочные данные (lookup tables),
  • агрегированные представления.

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

Именованные данные в Vega

В спецификации Vega данные описываются в массиве data, где каждый элемент может иметь поле name.

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

После объявления такой структуры данные становятся доступны через имя table.

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

{
  "from": {"data": "table"}
}

Именование превращает набор данных в глобально доступный ресурс внутри спецификации, что позволяет использовать его в:

  • mark definitions,
  • transforms,
  • scales,
  • signals.

Именованные источники в Vega-Lite

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

{
  "datasets": {
    "sales": [
      {"month": "Jan", "value": 100},
      {"month": "Feb", "value": 120}
    ]
  }
}

Доступ к данным осуществляется через ссылку $source в data:

{
  "data": {
    "name": "sales"
  }
}

Такой подход делает спецификацию более декларативной и облегчает повторное использование данных в разных местах одной диаграммы.

Область видимости именованных данных

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

  • имена уникальны внутри документа,
  • пересечение имён приводит к переопределению,
  • вложенные структуры могут ссылаться на родительские источники.

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

Использование именованных данных в трансформациях

Именованные источники данных особенно важны в трансформациях. Они позволяют строить цепочки обработки данных без потери исходного набора.

Фильтрация

{
  "transform": [
    {
      "filter": "datum.value > 30"
    }
  ],
  "from": {"data": "table"}
}

Агрегация

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

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

Связь между несколькими именованными источниками

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

Lookup-трансформации

{
  "transform": [
    {
      "lookup": "category",
      "from": {
        "data": "categories",
        "key": "id",
        "fields": ["label"]
      }
    }
  ],
  "from": {"data": "table"}
}

Здесь происходит связывание двух именованных источников: основной таблицы и справочника категорий. Такая схема аналогична операции JOIN в реляционных базах данных.

Переиспользование данных в слоях (layered charts)

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

{
  "layer": [
    {
      "data": {"name": "table"},
      "mark": "bar"
    },
    {
      "data": {"name": "table"},
      "mark": "line"
    }
  ]
}

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

Производные источники данных

Именованные источники могут быть не только статическими, но и вычисляемыми. Это создаёт цепочку производных данных.

{
  "data": [
    {
      "name": "base",
      "values": [
        {"x": 1, "y": 10},
        {"x": 2, "y": 20}
      ]
    },
    {
      "name": "derived",
      "source": "base",
      "transform": [
        {"calculate": "datum.y * 2", "as": "y2"}
      ]
    }
  ]
}

Здесь derived зависит от base, формируя направленный граф зависимостей данных.

Именованные источники и сигналы

В Vega именованные данные тесно взаимодействуют с сигналами. Сигналы могут изменять поведение данных, а данные могут влиять на сигналы через вычисления.

{
  "signals": [
    {
      "name": "threshold",
      "value": 50
    }
  ]
}
{
  "transform": [
    {
      "filter": "datum.value > threshold"
    }
  ],
  "from": {"data": "table"}
}

Таким образом создаётся динамическая связь между параметрами и данными, где именованные источники выступают точками привязки.

Конфликты имён и стратегии их разрешения

При работе с несколькими датасетами возможны конфликты:

  • повторное использование имени,
  • перекрытие локальных источников,
  • неоднозначные ссылки в трансформациях.

Стандартная стратегия — явное переименование и структурирование:

  • префиксы (raw_sales, agg_sales),
  • разделение по слоям,
  • вынесение базовых данных в корневой уровень спецификации.

Роль именованных источников в архитектуре визуализации

Именованные данные формируют основу архитектуры декларативных визуализаций. Они обеспечивают:

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

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