Streamgraph в Vega и Vega-Lite представляет собой разновидность многослойной площадной диаграммы, в которой отдельные временные ряды накладываются друг на друга с симметричным смещением относительно плавающей базовой линии. В отличие от обычной stacked area chart, где основание фиксировано, здесь используется оптимизация по «центру массы», что формирует характерную органическую, «текущую» форму слоёв.
Основная идея streamgraph заключается в преобразовании набора временных рядов в непрерывное поле площадей, где:
Ключевой алгоритм основан на stack layout с методом wiggle offset, который уменьшает «дрожание» слоёв и делает общую форму более плавной.
Для streamgraph используется «длинный» формат данных:
Пример структуры:
[
{ "date": "2024-01-01", "category": "A", "value": 12 },
{ "date": "2024-01-01", "category": "B", "value": 7 },
{ "date": "2024-01-02", "category": "A", "value": 9 }
]
Важно, чтобы данные были нормализованы: каждая категория должна иметь значение для каждого шага времени, иначе потребуется агрегация или заполнение пропусков.
В Vega-Lite streamgraph строится через комбинацию
mark: "area" и трансформации stack.
Базовая конфигурация:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"date": "2024-01-01", "category": "A", "value": 12},
{"date": "2024-01-01", "category": "B", "value": 7},
{"date": "2024-01-02", "category": "A", "value": 9},
{"date": "2024-01-02", "category": "B", "value": 4}
]
},
"mark": {
"type": "area"
},
"encoding": {
"x": {
"field": "date",
"type": "temporal"
},
"y": {
"field": "value",
"type": "quantitative",
"stack": "center"
},
"color": {
"field": "category",
"type": "nominal"
}
}
}
Параметр:
"stack": "center"включает центрированное стэкирование, которое и формирует streamgraph-эффект.
Vega предоставляет более низкоуровневый контроль через transforms и
signals. Основной механизм — transform stack с параметром
offset: "wiggle".
Фрагмент спецификации:
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"data": [
{
"name": "table",
"values": [
{"x": 1, "y": 12, "c": "A"},
{"x": 1, "y": 7, "c": "B"},
{"x": 2, "y": 9, "c": "A"},
{"x": 2, "y": 4, "c": "B"}
]
}
],
"transform": [
{
"type": "stack",
"groupby": ["x"],
"field": "y",
"sort": {"field": "c"},
"offset": "wiggle",
"as": ["y0", "y1"]
}
]
}
Здесь создаются два производных поля:
y0 — нижняя граница слоя;y1 — верхняя граница слоя.Ключевое отличие streamgraph от стандартного stacked area заключается в выборе смещения слоёв.
Основные режимы offset:
zero — классическое накопление от нуля;center — симметричное распределение;wiggle — минимизация суммарного «дрожания»;normalize — нормализация до 100%.В streamgraph наиболее характерны:
Алгоритм wiggle минимизирует сумму квадратов отклонений производной, что визуально снижает резкие изменения толщины слоёв.
Порядок категорий влияет на восприятие структуры:
В Vega:
"sort": {
"field": "y",
"order": "descending"
}
Неправильная сортировка приводит к визуальным пересечениям и искажению структуры потоков.
Цвет играет критическую роль, поскольку слои часто пересекаются и имеют переменную толщину.
Используются:
Пример:
"color": {
"field": "category",
"type": "nominal",
"scale": {
"scheme": "category20b"
}
}
Для улучшения визуального восприятия применяются кривые:
monotone;cardinal;basis;В Vega-Lite:
"mark": {
"type": "area",
"interpolate": "monotone"
}
Это снижает угловатость и делает поток более естественным.
Streamgraph чаще всего применяется к временным рядам, поэтому критично:
При необходимости данные агрегируются:
Vega позволяет добавлять интерактивные элементы через signals:
Пример выделения слоя:
"signals": [
{
"name": "hover",
"value": null,
"on": [
{"events": "rect:mouseover", "update": "datum.category"},
{"events": "mouseout", "update": "null"}
]
}
]
И применение прозрачности:
"opacity": {
"signal": "hover && hover !== datum.c ? 0.2 : 1"
}
При большом количестве категорий возникают проблемы перегрузки:
Применяются подходы:
Неправильное построение streamgraph часто связано с:
Каждая из этих проблем приводит к разрыву непрерывности потоков и нарушению геометрии диаграммы.
В сложных визуализациях streamgraph комбинируется с:
Также возможно использование трансформаций:
fold — для преобразования широких таблиц;aggregate — для предварительной суммаризации;impute — для заполнения пропусков.При изменении масштаба по оси времени:
Это важная особенность: streamgraph не является строго инвариантным к zoom-операциям.
Streamgraph применяется для:
Основная ценность заключается в восприятии динамики долей во времени, а не абсолютных значений.