Vega и Vega-Lite используют декларативный подход, в котором
визуализации описываются через JSON-спецификации. Одной из ключевых
возможностей Vega-Lite является композиция графиков через
layer и масштабирование наборов графиков через
repeat. Их комбинация — layer внутри
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 позволяет накладывать несколько
визуальных слоёв в рамках одного графика:
Когда 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 применяется ко всем слоям
одновременно, если не переопределено локально.
В примере:
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. Это используется для разделения визуальных ролей.
{
"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 подчёркивает отдельные значения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"}
}
}
}
Важно различать:
facet + repeat создаёт сетку графиковlayer + repeat создаёт многослойный график в каждом
повтореСравнение:
В layer порядок элементов определяет z-index:
При использовании 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 управляет значением оси Yrow управляет цветовой дифференциациейПоведение layer внутри repeat имеет ряд
технических ограничений:
Комбинация layer + repeat фактически преобразует одну
декларацию в набор графов:
Модель эквивалентна:
for field in repeat:
render(
layer(
encoding(field)
)
)
Обобщённая форма:
{
"data": ...,
"repeat": { ... },
"spec": {
"layer": [
{ "mark": ... },
{ "mark": ... }
],
"encoding": {
"x": ...,
"y": {"field": {"repeat": "..."}}
}
}
}
Layer внутри repeat выполняет функцию расширения выразительности повторяющихся графиков:
В результате один шаблон описывает не один график, а целую систему связанных визуализаций с идентичной структурой слоёв.