Слой layer в Vega и Vega-Lite представляет собой
механизм композиции визуальных элементов в рамках одной сцены, где
несколько независимых описаний графиков накладываются друг на друга в
одной системе координат. Эта модель позволяет строить сложные
визуализации из простых компонентов без необходимости заранее «зашивать»
их в единый рендеринг.
Многослойная модель опирается на идею разделения визуализации на независимые декларации. Каждый слой описывает собственный набор:
Все слои объединяются в единую композицию, где они используют общие или частично разделённые масштабы и координатную систему.
Ключевой аспект:
слой не изменяет другие слои, он лишь добавляется поверх них в порядке объявления
В Vega-Lite слой задаётся через массив layer:
{
"data": { "url": "data.csv" },
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y1", "type": "quantitative" }
}
},
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y2", "type": "quantitative" }
}
}
]
}
Здесь оба слоя используют одну и ту же систему координат, но отображают разные серии данных.
Важной особенностью является наследование свойств из верхнего уровня спецификации:
data) могут быть общими для всех слоёвПример:
{
"data": { "url": "data.csv" },
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" }
},
"layer": [
{
"encoding": {
"y": { "field": "valueA", "type": "quantitative" }
}
},
{
"encoding": {
"y": { "field": "valueB", "type": "quantitative" }
}
}
]
}
Общий x-канал задаётся один раз, а y
различается на уровне слоёв.
Порядок в массиве layer определяет порядок
отрисовки:
Это критически важно при работе с:
opacity)Пример с акцентом:
{
"layer": [
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "value", "type": "quantitative" }
}
},
{
"mark": { "type": "point", "filled": true, "color": "red" },
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "value", "type": "quantitative" }
}
}
]
}
Линия формирует базовую структуру, точки визуально выделяют конкретные наблюдения.
Механизм layer особенно полезен для комбинирования
разных геометрических примитивов:
Пример комбинирования area и line:
{
"layer": [
{
"mark": "area",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "min", "type": "quantitative" },
"y2": { "field": "max" }
}
},
{
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "avg", "type": "quantitative" }
}
}
]
}
Такой подход позволяет визуализировать диапазон и среднее значение одновременно.
Важно различать два уровня композиции:
encoding управляет отображением одного marklayer объединяет несколько независимых marksОшибочная модель — пытаться выразить несколько графиков через один encoding. Правильная — разделение через слои.
По умолчанию слои в Vega-Lite используют общие масштабы, если:
Однако возможны независимые масштабы, если данные или типы
различаются. Это приводит к необходимости явного управления через
resolve:
{
"resolve": {
"scale": {
"y": "independent"
}
}
}
Это позволяет одному слою иметь собственную шкалу Y, не конфликтующую с другими.
Слои часто используют прозрачность для создания сложных эффектов наложения:
{
"layer": [
{
"mark": { "type": "area", "opacity": 0.3 }
},
{
"mark": "line"
}
]
}
Прозрачные слои позволяют:
Каждый слой может содержать собственные трансформации данных:
{
"layer": [
{
"transform": [
{ "filter": "datum.category === 'A'" }
],
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "value", "type": "quantitative" }
}
},
{
"transform": [
{ "filter": "datum.category === 'B'" }
],
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "value", "type": "quantitative" }
}
}
]
}
Такой подход позволяет из одного источника данных формировать независимые визуальные представления без дублирования датасетов.
Один из наиболее частых сценариев использования layer —
добавление текстовых аннотаций поверх графиков:
{
"layer": [
{
"mark": "line"
},
{
"mark": {
"type": "text",
"align": "left",
"baseline": "middle"
},
"encoding": {
"text": { "field": "label" }
}
}
]
}
Текстовые слои часто применяются для:
В Vega слой layer может быть вложенным, что позволяет
строить иерархические композиции:
Это превращает слой в универсальный механизм композиции графических сцен.
Хотя layer часто путают с другими механизмами
композиции, различия принципиальны:
layer — наложение в одной системе координатfacet — разбиение данных на подграфикиrepeat — повторение одной схемы для разных полейСлой не создаёт новых панелей, он работает внутри одной области отрисовки.
При проектировании визуализаций слой используется как базовый строительный блок:
Такая модель позволяет декомпозировать сложные визуализации на независимые декларативные части, каждая из которых отвечает за строго определённую визуальную роль.