Повторение по полям в Vega-Lite является механизмом генерации множественных визуализаций на основе набора полей данных без необходимости ручного дублирования описания графика. Концепция repeat позволяет декларативно задавать матрицу графиков, где каждая ячейка соответствует отдельному полю или комбинации полей, а структура визуализации остаётся единой.
В основе repeat лежит идея параметризации визуализации через список полей. Вместо того чтобы создавать несколько отдельных спецификаций, используется один шаблон, который «разворачивается» по указанным данным.
В системе Vega и её упрощённом диалекте Vega-Lite повторение относится к уровню top-level spec и тесно связано с компоновкой (layout composition). Repeat не является трансформацией данных в классическом смысле; это механизм генерации нескольких view.
Ключевые формы repeat:
row)column)Типовая структура repeat задаётся следующим образом:
{
"data": {"url": "data.csv"},
"repeat": {
"column": ["A", "B", "C"]
},
"spec": {
"mark": "line",
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": {"repeat": "column"}, "type": "quantitative"}
}
}
}
Здесь ключевой элемент:
{"field": {"repeat": "column"}}
Он указывает, что значение поля будет подставляться из текущего
элемента массива column.
Колонное повторение создаёт набор графиков, размещённых горизонтально. Каждая колонка соответствует одному полю.
"repeat": {
"column": ["sales", "profit", "discount"]
}
Такой подход используется, когда требуется сравнение одинаковой метрики по разным переменным.
Строчное повторение размещает графики вертикально:
"repeat": {
"row": ["q1", "q2", "q3", "q4"]
}
Обычно применяется для временных сегментов или категориальных разрезов.
Комбинация:
"repeat": {
"row": ["A", "B"],
"column": ["X", "Y", "Z"]
}
Создаёт матрицу 2×3, где каждая ячейка соответствует паре (row, column).
Наиболее важная часть механизма — использование repeat внутри encoding.
"encoding": {
"y": {"field": {"repeat": "row"}, "type": "quantitative"},
"x": {"field": "year", "type": "temporal"}
}
Здесь:
repeat: "row" — подставляет текущий элемент из списка
rowrepeat: "column" — аналогично для колонокЭто позволяет одному шаблону графика адаптироваться к разным полям.
При компиляции спецификации Vega-Lite происходит разворачивание repeat в набор независимых view.
Алгоритм:
Результат эквивалентен множеству отдельных графиков, но описан декларативно.
Несмотря на схожесть, repeat и facet имеют принципиальные различия.
Facet группирует данные по значению поля:
"facet": {
"row": {"field": "category", "type": "nominal"}
}
Особенность:
Repeat работает с именами полей:
"repeat": {
"row": ["sales", "profit"]
}
Особенность:
Таким образом:
Repeat особенно эффективен, когда данные имеют широкий формат:
| date | sales | profit | cost |
|---|---|---|---|
| … | … | … | … |
В таком случае удобно:
"repeat": {
"column": ["sales", "profit", "cost"]
}
И избежать преобразования в длинный формат.
Если данные уже находятся в long format, repeat становится менее естественным и чаще заменяется facet или transform.
Каждый повторяемый график может иметь независимые оси или общие шкалы.
"resolve": {
"scale": {
"y": "independent"
}
}
Это позволяет каждой панели иметь собственный диапазон значений.
"resolve": {
"scale": {
"y": "shared"
}
}
Используется для прямого сравнения между графиками.
Repeat совместим со всеми базовыми mark-типами:
Пример линейного повторения:
{
"data": {"url": "stocks.csv"},
"repeat": {
"column": ["AAPL", "GOOG", "MSFT"]
},
"spec": {
"mark": "line",
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": {"repeat": "column"}, "type": "quantitative"}
}
}
}
Каждая линия отображает отдельный временной ряд.
Repeat может использоваться в сочетании с другими композиционными операциями, например facet + layer, но имеет ограничения:
Если поле отсутствует:
"repeat": {
"column": ["missing_field"]
}
результат — пустая визуализация.
Repeat не проверяет семантику полей. Если одно поле количественное, другое категориальное, но используется одинаковый mark, результат может быть визуально некорректным.
Без resolve.scale панели могут интерпретировать данные по-разному, что затрудняет сравнение.
С точки зрения архитектуры спецификации repeat является формой compile-time макроса:
Это делает repeat ключевым инструментом при построении аналитических панелей.
При добавлении интерактивных элементов (selection, filter) поведение зависит от области действия:
Пример:
"selection": {
"brush": {"type": "interval"}
}
В repeat каждая панель получает собственный brush, если не задано иное разрешение.
Repeat увеличивает количество view линейно:
Это важно учитывать при:
Оптимизация обычно достигается через ограничение числа повторяемых полей или агрегацию данных до построения визуализации.
Используется для сравнения показателей:
Используется для анализа периодов:
Матрица повторений применяется для анализа взаимосвязей переменных.
Поведение repeat можно формализовать как функцию:
Где S(fi) — это подстановка field = fi во все выражения repeat внутри encoding.
Такой подход делает repeat фундаментальным механизмом декларативной генерации визуализаций в экосистеме Vega-Lite.