Вертикальная конкатенация в Vega-Lite и Vega используется для
композиции нескольких визуализаций в единый стек, где каждый график
располагается один под другим и разделяет общую горизонтальную ось или
независимые шкалы. Механизм vconcat позволяет строить
составные представления данных, в которых каждый слой отвечает за свою
часть анализа, сохраняя при этом логическую связность между визуальными
компонентами.
Ключевая идея заключается в том, что визуализации рассматриваются как независимые спецификации, которые объединяются в вертикальный контейнер. Такой подход особенно эффективен при сравнении нескольких метрик, отображении разных агрегаций одного набора данных или последовательном раскрытии уровней детализации.
В Vega-Lite вертикальная композиция задаётся через свойство:
{
"vconcat": [
{ "mark": "..." , "encoding": { ... } },
{ "mark": "..." , "encoding": { ... } }
]
}
Каждый элемент массива представляет собой полноценную спецификацию графика. Эти графики размещаются вертикально, сохраняя общий контейнер.
В Vega (низкоуровневый язык) используется аналогичная концепция через
vconcat, но с более явным управлением сценой и
масштабами.
Одним из ключевых аспектов является управление шкалами (scales). По
умолчанию Vega-Lite не синхронизирует шкалы между элементами
vconcat, если это не указано явно.
Поведение контролируется через resolve:
{
"vconcat": [
{ "mark": "line", "encoding": { "x": { "field": "date", "type": "temporal" }, "y": { "field": "valueA", "type": "quantitative" } } },
{ "mark": "line", "encoding": { "x": { "field": "date", "type": "temporal" }, "y": { "field": "valueB", "type": "quantitative" } } }
],
"resolve": {
"scale": {
"y": "shared"
}
}
}
"shared" — общая шкала между графиками"independent" — независимые шкалы (по умолчанию)Синхронизация особенно важна при сравнении метрик, имеющих одинаковую размерность.
Вертикальная конкатенация часто применяется для анализа временных рядов, когда требуется сопоставить несколько показателей в одинаковом временном диапазоне.
Каждый график отображает свою переменную, но ось времени остаётся согласованной.
{
"data": { "name": "dataset" },
"vconcat": [
{
"mark": "line",
"encoding": {
"x": { "field": "time", "type": "temporal" },
"y": { "field": "temperature", "type": "quantitative" }
}
},
{
"mark": "line",
"encoding": {
"x": { "field": "time", "type": "temporal" },
"y": { "field": "humidity", "type": "quantitative" }
}
}
]
}
vconcat позволяет разносить уровни анализа по вертикали:
Такая структура применяется в аналитических панелях, где важно сочетать обзор и детализацию.
Часто используется для сопоставления различных статистических представлений одного набора данных:
Для упрощения спецификаций Vega-Lite позволяет задавать общие параметры на уровне контейнера:
{
"config": {
"axis": {
"labelFontSize": 12,
"titleFontSize": 14
}
},
"vconcat": [
{ "mark": "bar", "encoding": { ... } },
{ "mark": "line", "encoding": { ... } }
]
}
Общие настройки применяются ко всем вложенным визуализациям, если они не переопределены локально.
Каждый элемент vconcat имеет собственную высоту, которая
может задаваться явно или вычисляться автоматически.
{
"vconcat": [
{ "height": 100, "mark": "line", "encoding": { ... } },
{ "height": 200, "mark": "bar", "encoding": { ... } }
]
}
Если высота не указана, Vega-Lite распределяет пространство пропорционально содержимому и глобальным ограничениям.
Ось X чаще всего синхронизируется между всеми элементами вертикальной композиции, поскольку именно она представляет общую шкалу измерения.
Синхронизация улучшает читаемость и снижает когнитивную нагрузку при анализе нескольких графиков одновременно.
Каждый график внутри vconcat может:
transform){
"data": { "name": "dataset" },
"vconcat": [
{
"transform": [{ "filter": "datum.type == 'A'" }],
"mark": "line",
"encoding": { ... }
},
{
"transform": [{ "filter": "datum.type == 'B'" }],
"mark": "line",
"encoding": { ... }
}
]
}
Такой подход позволяет строить разрезы данных без дублирования исходных источников.
vconcat может комбинироваться с другими типами компоновки:
hconcat — горизонтальная композицияlayer — наложение графиковfacet — автоматическое разбиение по категориямПример вложенной структуры:
{
"vconcat": [
{
"hconcat": [
{ "mark": "line", "encoding": { ... } },
{ "mark": "bar", "encoding": { ... } }
]
},
{
"layer": [
{ "mark": "line", "encoding": { ... } },
{ "mark": "point", "encoding": { ... } }
]
}
]
}
Такая архитектура позволяет строить сложные аналитические панели без перехода к низкоуровневому Vega.
Каждый график может содержать собственные:
titleaxis.titlelegendПри вертикальной композиции важно избегать избыточности, особенно если оси дублируются.
{
"vconcat": [
{
"title": "Температура",
"mark": "line",
"encoding": { ... }
},
{
"title": "Влажность",
"mark": "line",
"encoding": { ... }
}
]
}
При работе с большим количеством элементов vconcat важно учитывать:
Оптимизация достигается через:
В Vega vconcat реализуется через композицию сцен
(scenegraph). Каждый элемент:
Это даёт более гибкий контроль, но требует ручного управления согласованностью шкал и размеров.
resolve могут искажать
восприятие данныхСтруктура эффективной vconcat-композиции обычно следует принципу:
Такое расположение соответствует естественному направлению визуального анализа сверху вниз и уменьшает когнитивные переключения между уровнями данных.