Поле layer внутри repeat

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


Повторяемые поля (repeat) как основа масштабируемых визуализаций

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

Типичная структура:

{
  "data": {"url": "data.csv"},
  "repeat": {
    "column": ["a", "b", "c"]
  },
  "spec": {
    "mark": "bar",
    "encoding": {
      "x": {"field": {"repeat": "column"}, "type": "quantitative"},
      "y": {"aggregate": "mean", "field": "value"}
    }
  }
}

Здесь:

  • repeat.column определяет список полей
  • {"repeat": "column"} подставляет текущее поле в каждый экземпляр графика
  • создаётся набор отдельных визуализаций

Ограничение базового repeat и необходимость layer

Стандартный repeat создаёт независимые визуализации. Это означает:

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

Для задач сравнения нескольких переменных на одной координатной системе используется комбинация layer + repeat.


Layer внутри repeat: концептуальная модель

Конструкция layer позволяет накладывать несколько визуальных слоёв в рамках одного графика:

  • линия тренда поверх точек
  • сглаженная кривая поверх исходных значений
  • несколько метрик на одной оси

Когда layer помещается внутрь repeat, каждый повторяемый график становится многослойным.

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

{
  "data": {"url": "data.csv"},
  "repeat": {
    "column": ["a", "b", "c"]
  },
  "spec": {
    "layer": [
      { "mark": "line" },
      { "mark": "point" }
    ],
    "encoding": {
      "x": {"field": "date", "type": "temporal"},
      "y": {"field": {"repeat": "column"}, "type": "quantitative"}
    }
  }
}

Поведение encoding внутри layer + repeat

Ключевой момент: encoding применяется ко всем слоям одновременно, если не переопределено локально.

В примере:

  • ось X общая для всех слоёв
  • ось Y зависит от повторяемого поля
  • repeat заменяет значение только там, где явно указано

Разделение слоёв с различной семантикой

Layer внутри repeat особенно полезен, когда слои выполняют разные функции.

Пример: линия + скользящее среднее

{
  "data": {"url": "data.csv"},
  "transform": [
    {
      "window": [
        {"op": "mean", "field": "value", "as": "moving_avg"}
      ],
      "frame": [-5, 5]
    }
  ],
  "repeat": {
    "column": ["value", "moving_avg"]
  },
  "spec": {
    "layer": [
      {
        "mark": "line"
      }
    ],
    "encoding": {
      "x": {"field": "date", "type": "temporal"},
      "y": {"field": {"repeat": "column"}, "type": "quantitative"}
    }
  }
}

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


Локальные переопределения encoding в слоях

Каждый слой может переопределять часть encoding. Это используется для разделения визуальных ролей.

{
  "repeat": {
    "column": ["sales", "profit"]
  },
  "spec": {
    "layer": [
      {
        "mark": "line",
        "encoding": {
          "color": {"value": "steelblue"}
        }
      },
      {
        "mark": "point",
        "encoding": {
          "size": {"value": 40}
        }
      }
    ],
    "encoding": {
      "x": {"field": "month", "type": "temporal"},
      "y": {"field": {"repeat": "column"}, "type": "quantitative"}
    }
  }
}

Поведение:

  • line отвечает за непрерывную структуру данных
  • point подчёркивает отдельные значения
  • оба слоя используют одинаковую ось Y, подставляемую через repeat

Множественные метрики в одном повторе

Layer + repeat позволяет строить сравнительные графики без создания дополнительных панелей.

Пример: сравнение показателей в одном пространстве:

{
  "data": {"url": "metrics.json"},
  "repeat": {
    "column": ["cpu", "memory", "disk"]
  },
  "spec": {
    "layer": [
      {
        "mark": "area",
        "encoding": {
          "opacity": {"value": 0.2}
        }
      },
      {
        "mark": "line"
      }
    ],
    "encoding": {
      "x": {"field": "time", "type": "temporal"},
      "y": {"field": {"repeat": "column"}, "type": "quantitative"}
    }
  }
}

Отличие layer+repeat от facet+repeat

Важно различать:

  • facet + repeat создаёт сетку графиков
  • layer + repeat создаёт многослойный график в каждом повторе

Сравнение:

facet

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

layer + repeat

  • общий контекст координат
  • наложение маркеров и представлений

Вложенные слои и порядок рендеринга

В layer порядок элементов определяет z-index:

  1. нижние слои — фоновые области, area, area chart
  2. средние слои — линии
  3. верхние слои — точки, аннотации

При использовании repeat каждый повтор наследует этот порядок.


Сложные паттерны: multi-layer multi-repeat

Допускается комбинация нескольких repeat-переменных и сложных слоёв.

{
  "repeat": {
    "column": ["a", "b"],
    "row": ["x", "y"]
  },
  "spec": {
    "layer": [
      {"mark": "line"},
      {"mark": "point"}
    ],
    "encoding": {
      "x": {"field": "t", "type": "temporal"},
      "y": {"field": {"repeat": "column"}, "type": "quantitative"},
      "color": {"field": {"repeat": "row"}}
    }
  }
}

Здесь:

  • column управляет значением оси Y
  • row управляет цветовой дифференциацией
  • layer накладывает два типа маркеров

Ограничения и особенности реализации

Поведение layer внутри repeat имеет ряд технических ограничений:

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

Семантическая модель данных

Комбинация layer + repeat фактически преобразует одну декларацию в набор графов:

  • шаблон слоя
  • список полей повторения
  • генерация независимых визуальных экземпляров

Модель эквивалентна:

for field in repeat:
    render(
        layer(
            encoding(field)
        )
    )

Практическая структура спецификации

Обобщённая форма:

{
  "data": ...,
  "repeat": { ... },
  "spec": {
    "layer": [
      { "mark": ... },
      { "mark": ... }
    ],
    "encoding": {
      "x": ...,
      "y": {"field": {"repeat": "..."}}
    }
  }
}

Роль layer в масштабировании повторяемых визуализаций

Layer внутри repeat выполняет функцию расширения выразительности повторяющихся графиков:

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

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