Иерархические визуализации в Vega и Vega-Lite опираются на преобразование плоских наборов данных в древовидные структуры. Ключевая особенность таких трансформаций заключается в переходе от таблицы записей к иерархии узлов с вычисленными координатами, глубиной, размерами и вложенностью. В основе лежат три основных этапа: формирование иерархии, вычисление структуры дерева и последующая упаковка пространства (layout), включая алгоритмы tree, treemap, pack и partition.
Иерархические данные в Vega описываются как дерево, где каждый узел содержит:
Однако исходные данные почти всегда представлены в плоском виде:
[
{ "id": "A", "parent": null, "value": 10 },
{ "id": "B", "parent": "A", "value": 5 },
{ "id": "C", "parent": "A", "value": 3 }
]
Для преобразования используется этап stratify.
Transform stratify выполняет преобразование плоского
списка в иерархическую структуру.
Пример конфигурации:
{
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
}
]
}
Результат этого этапа ещё не содержит координат — только структуру.
После построения иерархии применяется tree transform,
который вычисляет координаты узлов для древовидной визуализации.
Алгоритм строит классическое дерево:
{
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "tree",
"method": "tidy",
"size": [800, 400],
"separation": true,
"as": ["x", "y", "depth", "children"]
}
]
}
Transform treemap применяется для отображения
иерархических данных в виде вложенных прямоугольников, где площадь
каждого прямоугольника пропорциональна значению узла.
В Vega используется вариация алгоритма squarified treemap, который минимизирует диспропорции сторон прямоугольников.
{
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "treemap",
"field": "value",
"size": [800, 600],
"paddingInner": 2,
"paddingOuter": 4,
"ratio": 1.6,
"as": ["x0", "y0", "x1", "y1", "depth", "children"]
}
]
}
Каждый узел получает координаты:
Из них вычисляются:
Эти значения напрямую используются для построения прямоугольников.
Перед применением treemap часто требуется агрегация значений:
Пример агрегации:
{
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "treemap",
"field": "value",
"method": "sum"
}
]
}
Padding влияет на читаемость структуры:
Эти параметры позволяют выделять уровни вложенности и предотвращать визуальное слипание элементов.
Иерархические трансформации часто дополняются цветовой схемой:
Типичный подход:
При больших деревьях (тысячи и десятки тысяч узлов) treemap и tree требуют оптимизации:
Treemap особенно чувствителен к числу узлов из-за рекурсивного деления пространства.
В Vega-Lite иерархические трансформации часто скрыты за более декларативным синтаксисом. Вместо прямого описания алгоритмов используется комбинация:
Пример упрощённой спецификации:
{
"data": {"name": "table"},
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "treemap",
"field": "value"
}
],
"mark": "rect",
"encoding": {
"x": {"field": "x0"},
"x2": {"field": "x1"},
"y": {"field": "y0"},
"y2": {"field": "y1"}
}
}
В сложных визуализациях допускается комбинирование подходов:
Такие гибридные модели часто применяются в аналитике больших иерархий, где важны и структура, и количественные соотношения.