Трансформация linkpath в Vega используется для
построения геометрии связей между узлами графа в виде SVG/Canvas-путей.
Она преобразует табличные данные с парами “источник–назначение” в набор
кривых или ломаных линий, которые могут быть отрисованы как рёбра графа,
связи иерархии или дуги сетевых структур.
Ключевая идея трансформации заключается в отделении логики вычисления маршрута линии от логики визуального представления. В результате данные остаются простыми (узлы и связи), а сложная геометрия формируется на этапе трансформации.
linkpath применяется в задачах, где необходимо
визуализировать отношения между объектами:
Главная задача трансформации — превратить дискретные связи в
непрерывные пути, пригодные для визуализации через mark типа
path или line.
На вход подаётся набор связей вида:
После применения linkpath:
pathВ Vega трансформации задаются внутри блока
transform:
{
"type": "linkpath",
"sourceX": "source.x",
"sourceY": "source.y",
"targetX": "target.x",
"targetY": "target.y"
}
После выполнения появляется новое поле:
path — строка SVG path dataОпределяют координаты начальной точки связи.
Пример:
"sourceX": "source.x",
"sourceY": "source.y"
Определяют координаты конечной точки связи.
"targetX": "target.x",
"targetY": "target.y"
Задаёт ориентацию построения пути.
Используется для управления направлением кривой:
Типичная роль — согласование с layout-алгоритмом.
Определяет форму линии.
На практике чаще всего используются:
Трансформация выполняет несколько шагов:
Результат выглядит как:
M x1,y1 C cx1,cy1 cx2,cy2 x2,y2
или в ломаном варианте:
M x1,y1 L x2,y2
Для дерева часто используется layout, который уже вычисляет позиции
узлов, после чего linkpath соединяет parent-child
связи.
{
"data": { "name": "links" },
"transform": [
{
"type": "linkpath",
"sourceX": "source.x",
"sourceY": "source.y",
"targetX": "target.x",
"targetY": "target.y",
"orient": "horizontal",
"shape": "curve"
}
]
}
Результат — плавные дуги между узлами дерева.
В сетевых графах координаты могут приходить из force layout.
{
"type": "linkpath",
"sourceX": "source.x",
"sourceY": "source.y",
"targetX": "target.x",
"targetY": "target.y",
"shape": "line"
}
Здесь связи остаются прямыми, так как важно подчеркнуть структуру, а не визуальную плавность.
linkpath почти всегда используется совместно с
layout-алгоритмами:
Типичный pipeline:
stratify → строит иерархиюtree → вычисляет координатыlinkpath → соединяет узлыpathРезультат трансформации напрямую используется в mark:
{
"type": "path",
"from": { "data": "links" },
"encode": {
"update": {
"path": { "field": "path" },
"stroke": { "value": "#999" }
}
}
}
Поле path становится источником геометрии.
При направленных графах важно различать источник и цель.
linkpath сохраняет направление, что позволяет:
Стрелки обычно добавляются отдельно через marks или символы на конце пути.
При shape: curve алгоритм создаёт контрольные точки,
зависящие от ориентации:
Это снижает визуальную перегруженность графов с большим количеством рёбер.
При большом количестве связей трансформация остаётся линейной:
Узкие места чаще возникают не в linkpath, а в:
Если sourceX или targetY не определены,
путь не будет построен.
Если узлы и связи берутся из разных источников координат, линии будут “разъезжаться”.
При несоответствии orient layout-у:
linkpath выполняет промежуточную роль между:
Это типичный пример декларативной геометрической трансформации, где: