Диаграмма связей представляет собой способ визуализации графов, в котором вершины располагаются вдоль одной оси (обычно линейной или круговой), а связи между ними отображаются дугами. Такой формат позволяет компактно представить структуру сетей, где важны не географические координаты, а отношения между сущностями: социальные графы, зависимости модулей, связи между объектами.
В контексте Vega и Vega-Lite arc diagram строится на основе декларативного описания данных, где визуальные элементы определяются через каналы привязки данных к геометрическим примитивам.
Базовая модель графа состоит из двух типов сущностей:
Формат данных обычно задаётся в виде таблицы рёбер:
[
{ "source": "A", "target": "B", "value": 1 },
{ "source": "A", "target": "C", "value": 2 },
{ "source": "B", "target": "D", "value": 1 }
]
Из этой структуры далее вычисляется множество уникальных узлов и их порядок на оси.
Ключевой этап подготовки данных:
Arc diagram опирается на три компонента:
Геометрия дуги определяется парой координат:
При этом y часто фиксируется, а дуга формируется через контрольную точку, создающую изгиб вверх или вниз.
В Vega arc diagram строится через низкоуровневые примитивы:
symbol для узлов и path для связей.
Основная идея — предварительно вычислить координаты узлов через
window или formula.
{
"name": "nodes",
"source": "links",
"transform": [
{ "type": "fold", "fields": ["source", "target"], "as": ["role", "node"] },
{ "type": "aggregate", "groupby": ["node"] },
{ "type": "window", "ops": ["row_number"], "as": ["index"] }
]
}
Далее индекс используется для координаты:
{
"name": "edges",
"source": "links",
"transform": [
{
"type": "lookup",
"from": "nodes",
"key": "node",
"fields": ["source"],
"as": ["sourceNode"]
},
{
"type": "lookup",
"from": "nodes",
"key": "node",
"fields": ["target"],
"as": ["targetNode"]
},
{
"type": "linkpath",
"shape": "arc",
"sourceX": "sourceNode.x",
"targetX": "targetNode.x",
"sourceY": 200,
"targetY": 200
}
]
}
{
"type": "path",
"from": { "data": "edges" },
"encode": {
"enter": {
"path": { "field": "path" },
"stroke": { "value": "#999" },
"strokeWidth": { "value": 1 }
}
}
}
Узлы:
{
"type": "symbol",
"from": { "data": "nodes" },
"encode": {
"enter": {
"x": { "field": "x" },
"y": { "value": 200 },
"size": { "value": 80 },
"fill": { "value": "steelblue" }
}
}
}
В Vega-Lite нет полноценного специализированного типа arc diagram,
поэтому используется комбинация слоёв (layer) и
преобразований данных.
{
"data": { "values": links },
"transform": [
{ "fold": ["source", "target"], "as": ["role", "node"] },
{ "aggregate": [{ "op": "count", "as": "degree" }], "groupby": ["node"] },
{ "window": [{ "op": "row_number", "as": "index" }] }
]
}
{
"mark": "point",
"encoding": {
"x": { "field": "index", "type": "quantitative" },
"y": { "value": 0 },
"tooltip": [{ "field": "node" }]
}
}
Vega-Lite не всегда напрямую поддерживает кривые arc diagram, поэтому используется приближение:
{
"mark": "rule",
"encoding": {
"x": { "field": "sourceIndex" },
"x2": { "field": "targetIndex" },
"y": { "value": 0 },
"strokeWidth": { "field": "value" }
}
}
Такой подход создаёт линейные связи. Для дуг требуется использование
Vega или кастомного path.
Порядок узлов критически влияет на читаемость диаграммы.
Используются стратегии:
Проста, но часто даёт пересечения дуг.
Узлы с большим количеством связей располагаются ближе к центру.
Группы узлов размещаются блоками, уменьшая пересечения.
Основные техники:
Все дуги направляются вверх:
"strokeOpacity": 0.3
При увеличении количества узлов возникают проблемы:
Используются методы:
{ "filter": "datum.value > 2" }
Объединение множества связей между двумя узлами в одну:
Arc diagram в Vega/Vega-Lite может включать:
"opacity": {
"condition": {
"selection": "hover",
"value": 1
},
"value": 0.2
}
Узлы располагаются по окружности:
polar coordinatesПри использовании Vega-Lite возникают ограничения:
linkpathПоэтому архитектура часто выглядит так:
Классическая дуга определяется как квадратичная кривая Безье:
Формально:
Arc diagram используется для:
Частые проблемы:
Корректная модель всегда требует: