Площадная диаграмма с накоплением (stacked area chart) используется для визуализации изменения нескольких категориальных рядов во времени или по непрерывной шкале, где каждая серия не только отображает собственную динамику, но и формирует вклад в общий итог. В Vega-Lite этот тип графика поддерживается нативно через механизм стеков (stack), который автоматически вычисляет смещения по оси Y.
В основе лежит преобразование исходных значений в интервалы:
y0 — нижняя граница слояy1 — верхняя граница слояДля каждой категории в каждой точке по оси X выполняется кумулятивное суммирование значений:
[ y_1^{(i)} = _{k=1}^{i} v_k, y_0^{(i)} = y_1^{(i-1)}]
Таким образом формируется «слоёный» профиль, где каждый следующий слой опирается на предыдущий.
Минимальная спецификация строится вокруг mark "area" и
параметра stack: "zero".
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"year": 2018, "type": "A", "value": 28},
{"year": 2018, "type": "B", "value": 55},
{"year": 2018, "type": "C", "value": 43},
{"year": 2019, "type": "A", "value": 35},
{"year": 2019, "type": "B", "value": 60},
{"year": 2019, "type": "C", "value": 50}
]
},
"mark": "area",
"encoding": {
"x": {
"field": "year",
"type": "ordinal"
},
"y": {
"field": "value",
"type": "quantitative",
"stack": "zero"
},
"color": {
"field": "type",
"type": "nominal"
}
}
}
mark: "area" активирует построение заполненной
областиstack: "zero" задаёт накопление от нулевой базовой
линииcolor определяет разбиение на слоиVega-Lite поддерживает несколько стратегий накопления:
"zero" — накопление от нуля"normalize" — нормализация до 100%"center" — центрирование вокруг нулевой оси
(симметричная диаграмма)null — отключение стековПример процентной нормализации:
{
"y": {
"field": "value",
"type": "quantitative",
"stack": "normalize"
}
}
Такой режим используется для анализа долей, а не абсолютных значений.
Порядок накопления критически влияет на форму диаграммы. Управляется
через sort.
"color": {
"field": "type",
"type": "nominal",
"sort": "ascending"
}
Или явное задание порядка:
"sort": ["A", "B", "C"]
Неправильная сортировка может визуально исказить вклад категорий.
При работе с временными рядами используется тип
temporal.
"x": {
"field": "year",
"type": "temporal"
}
Пример с ISO датами:
{"date": "2020-01-01", "type": "A", "value": 120}
Vega-Lite позволяет управлять формой линии через
interpolate.
"mark": {
"type": "area",
"interpolate": "monotone"
}
Доступные варианты:
linearmonotonestepcardinalСглаживание влияет только на визуальную форму, но не изменяет вычисленные значения стеков.
В Vega (низкоуровневый слой) стек формируется явно через
трансформацию stack.
{
"type": "stack",
"groupby": ["year"],
"field": "value",
"sort": {"field": "type"},
"as": ["y0", "y1"]
}
Далее область строится через area mark:
{
"type": "area",
"encode": {
"update": {
"x": {"scale": "x", "field": "year"},
"y": {"scale": "y", "field": "y1"},
"y2": {"scale": "y", "field": "y0"}
}
}
}
Для категорий используется шкала color:
"color": {
"field": "type",
"type": "nominal",
"scale": {
"scheme": "category10"
}
}
В сложных визуализациях применяются:
tableau10set2Интерактивность добавляется через tooltip:
"tooltip": [
{"field": "year", "type": "temporal"},
{"field": "type", "type": "nominal"},
{"field": "value", "type": "quantitative"}
]
Tooltip позволяет восстановить исходные значения, скрытые за слоёной структурой.
Для подготовки данных часто используется transform:
"transform": [
{
"aggregate": [
{"op": "sum", "field": "value", "as": "total"}
],
"groupby": ["year", "type"]
}
]
{
"calculate": "datum.value * 1.2",
"as": "adjusted"
}
stack: "zero")Используется для отображения общего объёма и вклада категорий.
stack: "normalize")Фокус на структуре распределения, а не на масштабе.
stack: "center")Применяется для симметричных данных и анализа отклонений.
"y": {
"axis": {
"title": "Объём",
"format": ".2f"
}
}
"x": {
"axis": {
"title": "Год",
"labelAngle": -45
}
}
Если данные представлены в «широком» формате, требуется трансформация
fold.
"transform": [
{
"fold": ["A", "B", "C"],
"as": ["type", "value"]
}
]
Это превращает таблицу в формат, пригодный для стековой визуализации.
Если данные уже агрегированы, повторное суммирование приводит к искажению стеков.
Без явного sort порядок слоёв становится
недетерминированным.
Использование ordinal вместо temporal для
временных данных ухудшает интерполяцию.
Нулевые значения сохраняют непрерывность слоя, но могут создавать
«разрывы» при использовании интерполяции step.
При тысячах точек Vega-Lite выполняет стекование на этапе трансформации. Узкие места возникают при:
Оптимизация достигается через:
aggregateVega позволяет реализовать кастомное стекование с динамическими условиями:
Площадная диаграмма с накоплением в Vega-Lite формируется из трёх ключевых компонентов:
x, y, color)stack)Эта комбинация обеспечивает автоматическое построение сложных многослойных временных распределений без ручного вычисления границ областей.