Vega и Vega-Lite используют систему трансформаций данных, в которой
stratify и treelinks формируют основу
построения и визуализации иерархий. Эти трансформации решают две
взаимосвязанные задачи: преобразование плоских данных в древовидную
структуру и последующее извлечение связей между узлами для рендеринга
рёбер графа.
stratify предназначена для преобразования плоского
списка объектов в иерархическую структуру на основе связей «родитель —
потомок». Это ключевой шаг при построении деревьев, оргструктур,
файловых систем и любых данных с явной иерархией.
Каждая запись исходного массива должна содержать:
key)parentKey)На основе этих полей строится дерево, где:
children[
{ "id": "A", "parent": null },
{ "id": "B", "parent": "A" },
{ "id": "C", "parent": "A" },
{ "id": "D", "parent": "B" }
]
В Vega-спецификации:
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
}
После выполнения формируется дерево:
A
B
C
Внутри структуры каждый узел получает:
childrenЕсли несколько записей имеют parent: null, формируется
лес (forest), то есть набор деревьев.
Если parentKey указывает на несуществующий узел,
поведение зависит от конфигурации пайплайна: узел может быть отброшен
или интерпретирован как корневой.
Циклические зависимости (A → B → A) приводят к некорректной иерархии и обычно ломают построение дерева, так как структура должна быть ацикличной.
В Vega трансформация включается в блок transform:
{
"data": {
"values": [
{ "id": "root", "parent": null },
{ "id": "n1", "parent": "root" },
{ "id": "n2", "parent": "root" }
]
},
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
}
]
}
После выполнения становится доступна иерархическая структура, которую
можно передавать в layout-трансформации (tree,
cluster) или использовать для вычисления связей.
После stratify данные обычно проходят через
дополнительные трансформации:
tree — вычисление координат узловcluster — компактная компоновка дереваpartition — радиальная иерархияtreemap — прямоугольная упаковкаОднако сами эти трансформации не создают связи между узлами в виде
рёбер. Для этого используется treelinks.
treelinks извлекает связи между узлами уже из
иерархической структуры, создавая набор рёбер (links), пригодных для
визуализации графов и деревьев.
Основная функция:
source → targetpath или
linetreelinks требует уже иерархическую структуру, например
результат stratify.
{
"type": "treelinks"
}
Дополнительные параметры обычно не требуются, так как трансформация
работает с уже вложенными children.
На выходе формируется массив рёбер:
[
{ "source": {...}, "target": {...} },
{ "source": {...}, "target": {...} }
]
Где:
source — родительский узелtarget — дочерний узелЭти объекты содержат ссылки на оригинальные узлы дерева.
treelinks применяется для построения:
Типичный сценарий — параллельное использование двух потоков данных:
treelinks)Иерархическая визуализация обычно строится через последовательность трансформаций:
{
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "tree",
"method": "tidy",
"size": [800, 400]
},
{
"type": "treelinks"
}
]
}
stratify формирует деревоtree вычисляет координаты узловtreelinks создаёт связи для рёбер{
"data": {
"values": [
{ "id": "A", "parent": null },
{ "id": "B", "parent": "A" },
{ "id": "C", "parent": "A" },
{ "id": "D", "parent": "B" }
]
},
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "tree",
"method": "tidy",
"size": [600, 300]
}
],
"marks": [
{
"type": "link",
"from": { "data": "tree" },
"transform": [
{
"type": "treelinks"
}
]
}
]
}
stratify отвечает за структуруtreelinks отвечает за связиТакое разделение позволяет переиспользовать дерево в разных типах визуализаций.
treelinks не копирует данные узлов, а создаёт ссылки на
существующие объекты. Это снижает накладные расходы при больших
графах.
Если вход не является деревом (например, отсутствует
stratify), treelinks не может корректно
построить связи.
Если key не уникален, дерево формируется некорректно,
возможны потери узлов.
Ссылки на несуществующие parent приводят к «висячим»
узлам.
При тысячах узлов:
stratify становится затратным по памятиtreelinks создаёт большое число рёбер, влияя на
рендерингНесколько независимых корней приводят к множеству деревьев.
treelinks в этом случае создаёт рёбра внутри каждого дерева
отдельно.
Чем больше глубина:
childrensource → targetstratify и treelinks часто используются
вместе с:
tree (ортогональная компоновка)cluster (иерархическая группировка)radialTree (радиальная компоновка)Layout определяет координаты, а treelinks использует их
для построения линий.