Вложенные составные виды

Архитектура композиции визуализаций

Система Vega и её декларативный слой Vega-Lite строится вокруг идеи компоновки визуальных представлений из независимых описаний. Базовый графический объект — вид (view) — может включать данные, шкалы, оси, преобразования и геометрические примитивы. Однако реальная сила системы проявляется при переходе к составным видам, где несколько визуализаций объединяются в единую структуру.

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

Ключевые механизмы композиции:

  • наложение (layer)
  • фасетирование (facet)
  • повторение (repeat)
  • конкатенация (concat: hconcat, vconcat)
  • вложенные сигналы и параметры (params/signals scoping)

Каждый механизм задаёт собственную семантику вложенности и правила наследования масштабов, осей и взаимодействий.


Наложение слоёв (Layered Views)

Механизм слоя позволяет объединять несколько геометрических представлений в одной системе координат.

Базовая структура layer

{
  "data": {"url": "data.csv"},
  "layer": [
    {
      "mark": "line",
      "encoding": {
        "x": {"field": "x", "type": "quantitative"},
        "y": {"field": "y1", "type": "quantitative"}
      }
    },
    {
      "mark": "point",
      "encoding": {
        "x": {"field": "x", "type": "quantitative"},
        "y": {"field": "y1", "type": "quantitative"}
      }
    }
  ]
}

Слой формирует единое пространство координат. Все дочерние элементы используют общие шкалы, если не переопределены правилами resolve.

Семантика слоя

  • общий контекст данных
  • совместное использование шкал
  • независимые mark-описания
  • последовательное наложение рендеринга

Сложные слои

Layer может включать вложенные layer, формируя многоуровневую композицию:

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

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


Разрешение конфликтов в слоях (resolve)

При объединении слоёв возникает необходимость управления шкалами и осями.

Основные стратегии resolve

{
  "resolve": {
    "scale": {
      "y": "independent"
    }
  }
}

Возможные режимы:

  • shared — общая шкала
  • independent — независимые шкалы

Применение

Независимые шкалы используются при наложении разнородных метрик:

  • разные единицы измерения
  • нормированные и абсолютные значения
  • комбинированные временные ряды

Фасетирование (Facet Views)

Фасетирование создаёт сетку визуализаций, разбитую по значениям категориального признака.

Простая фасетная структура

{
  "data": {"url": "data.csv"},
  "facet": {
    "row": {"field": "category", "type": "nominal"}
  },
  "spec": {
    "mark": "bar",
    "encoding": {
      "x": {"field": "value", "type": "quantitative"},
      "y": {"field": "name", "type": "nominal"}
    }
  }
}

Каждый facet-узел представляет собой отдельный view с одинаковой структурой спецификации.

Иерархия фасетирования

Facet поддерживает:

  • row-фасеты
  • column-фасеты
  • вложенные фасеты (multi-dimensional small multiples)
{
  "facet": {
    "row": {"field": "region"},
    "column": {"field": "year"}
  }
}

Модель данных фасета

Фасетирование фактически выполняет группировку данных:

  • входной датасет → partitioning
  • каждый partition → отдельный view
  • одинаковая encoding-схема

Вложенные фасеты

Фасеты могут быть вложены через spec, создавая многослойную сетку:

{
  "facet": {
    "row": {"field": "country"}
  },
  "spec": {
    "facet": {
      "column": {"field": "product"}
    },
    "spec": {
      "mark": "line"
    }
  }
}

Такая структура создаёт двухуровневую сегментацию:

  • внешний уровень: страны
  • внутренний уровень: продукты

Повторение визуализаций (Repeat)

Repeat позволяет автоматически клонировать одну визуализацию по наборам полей.

Горизонтальное повторение

{
  "repeat": {
    "column": ["a", "b", "c"]
  },
  "spec": {
    "mark": "line",
    "encoding": {
      "x": {"field": "x"},
      "y": {"field": {"repeat": "column"}}
    }
  }
}

Repeat формирует набор идентичных views с подстановкой полей.

Механика подстановки

  • repeat index заменяет field reference
  • encoding становится параметризованным
  • структура view не дублируется вручную

Многомерный repeat

{
  "repeat": {
    "row": ["a", "b"],
    "column": ["c", "d"]
  }
}

Результат — матрица графиков.


Конкатенация видов (Concat)

Concat объединяет независимые визуализации в единый layout без общего coordinate system.

Горизонтальная конкатенация

{
  "hconcat": [
    { "mark": "bar" },
    { "mark": "line" }
  ]
}

Вертикальная конкатенация

{
  "vconcat": [
    { "mark": "area" },
    { "mark": "point" }
  ]
}

Семантика concat

  • независимые данные и шкалы
  • общий контейнер layout
  • отсутствие общей системы координат

Concat используется для сравнительных панелей.


Гибридные композиции

Композиционные механизмы могут комбинироваться:

Layer внутри facet

{
  "facet": {
    "row": {"field": "group"}
  },
  "spec": {
    "layer": [
      { "mark": "line" },
      { "mark": "point" }
    ]
  }
}

Каждый facet-узел содержит layered chart.

Repeat внутри layer

{
  "layer": [
    {
      "repeat": {
        "column": ["a", "b"]
      },
      "spec": {
        "mark": "line"
      }
    }
  ]
}

Комбинации позволяют строить многомерные структуры визуального анализа.


Контекст параметров и сигналов

Вложенные виды используют систему локального контекста.

params в Vega-Lite

{
  "params": [
    {
      "name": "brush",
      "select": "interval"
    }
  ]
}

Параметры:

  • локальны для spec
  • могут пробрасываться вверх
  • могут использоваться в layer и facet

Проблема области видимости

При вложении:

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

Наследование и переопределение шкал

Вложенные структуры управляют шкалами:

  • facet → по умолчанию shared scales
  • layer → единое пространство
  • concat → независимые шкалы

Пример независимых шкал

{
  "resolve": {
    "scale": {
      "x": "independent",
      "y": "independent"
    }
  }
}

Вложенные виды в Vega (низкоуровневый API)

В Vega композиция задаётся через view hierarchy.

Структура view

{
  "type": "group",
  "marks": [],
  "scales": [],
  "axes": [],
  "signals": [],
  "encode": {}
}

Group view может содержать дочерние group:

  • формирование дерева визуализации
  • независимые сигналы
  • локальные трансформации

Вложенные сигналы

{
  "signals": [
    {
      "name": "x",
      "update": "width / 2"
    }
  ]
}

Сигналы могут быть:

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

Композиционные шаблоны

Small multiples

Комбинация facet + layer:

  • разделение по категориям
  • единая визуальная форма
  • сравнение распределений

Dashboard layout

Комбинация concat + independent scales:

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

Analytical overlay

Layer + resolve:

  • базовая линия
  • трендовые компоненты
  • интервальные оценки

Вложенность и производительность

Глубокая композиция влияет на:

  • количество view nodes
  • число пересчётов шкал
  • стоимость трансформаций данных

Оптимизация достигается через:

  • shared scales вместо independent
  • предварительную агрегацию данных
  • минимизацию nested facet depth

Семантика вложенных данных

Каждый уровень вложенности может:

  • фильтровать данные
  • трансформировать dataset
  • ограничивать encoding

Facet выполняет partitioning, layer выполняет overlay, repeat выполняет parameter expansion, concat выполняет layout aggregation.


Итоговая модель композиции

Вложенные составные виды формируют граф структуры:

  • узлы — views
  • рёбра — containment (layer/facet/concat/repeat)
  • контекст — scales, signals, data scope

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