Механизм многослойной визуализации в Vega-Lite основан на композиции
графиков через layer, где каждый слой представляет собой
автономное описание марки, данных и кодирования. При этом базовая модель
предполагает совместное использование одной системы координат, что в
простых случаях обеспечивает согласованность представления данных, но
становится ограничением при необходимости отображения величин с
различными единицами измерения или масштабами.
Ключевая особенность слоя заключается в том, что визуальные элементы
объединяются в единое полотно, однако поведение осей и шкал может как
наследоваться, так и быть переопределено через механизм разрешения
конфликтов (resolve).
Конструкция layer позволяет комбинировать несколько
визуальных представлений в одном графике:
mark и
encodingБазовая структура:
{
"data": { "url": "data.csv" },
"layer": [
{
"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" }
}
}
]
}
В таком виде оба ряда отображаются в одной системе координат, что приводит к автоматическому масштабированию по объединённому диапазону значений.
Система шкал Vega-Lite строится вокруг принципа автоматического
вывода домена (domain) и диапазона (range) на
основе всех задействованных слоёв. Для оси y это
означает:
Такой подход эффективен при сопоставимых величинах, но приводит к искажению формы данных при различии порядков:
В результате малые значения становятся визуально неразличимыми.
Механизм resolve позволяет переопределить поведение шкал
для каждого канала. Для задачи двойных осей используется настройка
независимости по y:
{
"data": { "url": "data.csv" },
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "temperature", "type": "quantitative" }
}
},
{
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "sales", "type": "quantitative" }
}
}
],
"resolve": {
"scale": {
"y": "independent"
}
}
}
При таком подходе Vega-Lite создаёт:
При включении y: "independent" каждая шкала получает
собственный:
Однако ось X остаётся общей, если не задано:
"resolve": {
"scale": {
"x": "shared",
"y": "independent"
}
}
Это формирует типичную структуру двойной оси:
{
"data": { "url": "metrics.csv" },
"layer": [
{
"mark": { "type": "line", "color": "#1f77b4" },
"encoding": {
"x": { "field": "month", "type": "temporal" },
"y": {
"field": "temperature",
"type": "quantitative",
"axis": { "title": "Температура" }
}
}
},
{
"mark": { "type": "line", "color": "#d62728" },
"encoding": {
"x": { "field": "month", "type": "temporal" },
"y": {
"field": "revenue",
"type": "quantitative",
"axis": { "title": "Выручка" }
}
}
}
],
"resolve": {
"scale": {
"y": "independent"
}
}
}
В этой конфигурации визуальное наложение сохраняет временную синхронизацию, но допускает различие масштабов без потери формы данных.
При использовании нескольких слоёв возникает проблема идентификации рядов. Vega-Lite не автоматически связывает независимые оси с легендой, если encoding не задан явно.
Типовые решения:
color в каждом слоеstrokeDash для различения линийlegendПример:
"encoding": {
"color": { "value": "#1f77b4" }
}
или через поле:
"color": { "field": "series", "type": "nominal" }
При независимых шкалах важно учитывать, что легенда не отражает различие осей, а только визуальные серии.
Наиболее распространённый сценарий двойных осей основан на жёсткой синхронизации временной оси:
x: shared temporal scaley: independent quantitative scalesТакое разделение позволяет:
При этом любые трансформации данных (transform)
применяются до разбиения на слои, что обеспечивает согласованность
временных точек.
При невозможности использования независимых осей применяется приведение к относительным значениям:
Это позволяет использовать shared scale, но сохранять читаемость трендов.
Vega-Lite допускает расширение через дополнительные слои:
"resolve": {
"scale": {
"y": "independent"
}
}
Каждый новый слой автоматически получает собственную шкалу, что приводит к множественным осям. Однако визуальная интерпретация становится ограниченной из-за перегрузки координатной системы.
Слойная модель позволяет сочетать различные mark-типы:
line для трендаarea для накопленных значенийbar для дискретных величинПри независимых шкалах каждый тип сохраняет собственную интерпретацию диапазона.
Использование y: "independent" в
resolve.scale приводит к ряду структурных последствий:
При этом Vega-Lite сохраняет строгую композиционную модель, где каждый слой остаётся логически автономным элементом сцены, а согласование происходит исключительно через общие каналы кодирования и явные правила разрешения шкал.