Форматы представления графовых данных в Nivo строятся вокруг универсальной модели «узлы и связи», которая используется в большинстве визуализаций сетей, потоков и иерархий. Эта модель обеспечивает совместимость с различными типами графов — от простых неориентированных сетей до сложных направленных потоков и деревьев.
Узел представляет собой сущность графа, которая может интерпретироваться как объект, участник или состояние системы. В Nivo узлы описываются как массив объектов, каждый из которых содержит как минимум уникальный идентификатор.
Типовая структура узла:
{
"id": "nodeA",
"label": "A",
"value": 42
}
id Уникальный идентификатор, используемый для связывания с другими узлами. Является обязательным полем.
label Отображаемое имя узла. Используется в подписях графа и tooltip-интерфейсах.
value Числовой параметр, определяющий «вес» узла. Применяется в визуализациях, где размер узла зависит от значимости.
Дополнительно могут использоваться произвольные поля:
Связи описывают отношения между узлами и формируют структуру графа. В Nivo связи всегда представлены отдельным массивом объектов.
Базовая структура связи:
{
"source": "nodeA",
"target": "nodeB",
"value": 10
}
source Идентификатор начального узла. Используется для построения направления связи.
target Идентификатор конечного узла.
value Числовой вес связи, влияющий на толщину линии, интенсивность потока или силу взаимодействия.
В некоторых типах графов направление может игнорироваться, однако структура сохраняется для унификации формата.
Модель узлов и связей опирается на принцип разделения сущностей и отношений. Узлы описывают множество объектов, а связи формируют топологию их взаимодействия.
Пример согласованной структуры:
{
"nodes": [
{ "id": "A" },
{ "id": "B" },
{ "id": "C" }
],
"links": [
{ "source": "A", "target": "B", "value": 5 },
{ "source": "B", "target": "C", "value": 3 }
]
}
Такой формат используется в force-directed графах, сетевых диаграммах и потоковых визуализациях.
Перед передачей данных в визуализацию Nivo выполняет логическую нормализацию:
Если узел отсутствует в массиве nodes, но встречается в links, поведение зависит от конкретного компонента: некоторые графы автоматически создают «виртуальные» узлы, другие игнорируют такие связи.
Поле value в связях используется для построения взвешенных структур. В различных типах диаграмм оно интерпретируется по-разному:
Пример взвешенного графа:
{
"nodes": [
{ "id": "X" },
{ "id": "Y" }
],
"links": [
{ "source": "X", "target": "Y", "value": 100 }
]
}
Формат links универсален, но семантика направления зависит от визуализации.
Используются в:
В таких структурах source → target имеет строгую интерпретацию потока.
Используются в force-directed сетях, где связь является симметричной. Несмотря на это, поля source и target сохраняются, но интерпретируются как равнозначные вершины ребра.
Хотя модель nodes/links является базовой, некоторые компоненты Nivo поддерживают альтернативное деревообразное представление:
{
"id": "root",
"children": [
{
"id": "child1",
"children": [
{ "id": "leaf1" }
]
}
]
}
Такой формат отличается отсутствием явного массива links. Связи здесь выражены через вложенность.
При необходимости дерево может быть преобразовано в node-link формат и обратно.
В Sankey-диаграммах структура nodes/links приобретает специфическую интерпретацию:
Особенность заключается в обязательной балансировке входящих и исходящих потоков для корректного отображения.
Chord использует тот же базовый принцип, но links часто представляются в виде матрицы или симметричных связей.
Пример логической модели:
{
"matrix": [
[0, 5, 3],
[5, 0, 2],
[3, 2, 0]
]
}
Матрица может быть преобразована в links для унификации обработки внутри визуализации.
Формат nodes/links в Nivo намеренно не жёстко типизирован. Это позволяет:
Расширенные поля часто используются для:
Часто исходные данные поступают в несовместимом формате:
Преобразование в nodes/links включает:
Пример adjacency list:
{
"A": ["B", "C"],
"B": ["C"]
}
Преобразуется в:
{
"nodes": [
{ "id": "A" },
{ "id": "B" },
{ "id": "C" }
],
"links": [
{ "source": "A", "target": "B" },
{ "source": "A", "target": "C" },
{ "source": "B", "target": "C" }
]
}
Корректность структуры nodes/links зависит от соблюдения нескольких правил:
Нарушение этих правил приводит к некорректной визуализации или потере части связей при рендеринге.
Перед передачей в компонент Nivo данные проходят этап подготовки:
Этот этап критически важен при работе с большими графами, где количество узлов и связей может исчисляться тысячами и десятками тысяч элементов.