Построение графиков Force Directed только из данных о связях

Я немного новичок в d3.js, но мне это очень нравится. До сих пор я реализовал силовой граф, который очень близок ко многим примерам и руководствам.

Прямая озабоченность

Как и во многих примерах, у меня есть такая структура JSON:

{"nodes": ["node1", "node2",  ... ],
 "links": [{source: 0, target: 1, "field1": 5, ...}, ... ]}

Однако я думаю, что было бы проще построить мои источники данных следующим образом:

{"links": [
    {source: "node1", target: "node2", "field1": 5, ...},
    {source: "node2", target: "node4", "field1": 1, ...},
    {source: "node3", target: "node4", "field1": 8, ...}
]}

Вместо явного определения узлов в моем графе они неявно определены в структурах ссылок.

Причина

Я хотел перечислить конечную цель проекта на случай, если у кого-то есть конкретный пример кода или идиоматический способ сделать это, о котором я не знаю.

В конечном итоге целью проекта станет график, который обновляется в режиме реального времени. Серверная часть находится в разработке и может быть изменена и доработана.

На данный момент я представляю, как каждые X секунд загружаю фид обновлений JSON и обновляю структуру этого графика новой информацией. Извлеченный канал будет содержать только обновленные структуры графа, поэтому скрипт должен будет поддерживать все уже извлеченные узлы и ссылки и при необходимости добавлять новые.

Спасибо!

Прошу прощения, если об этом уже спрашивали. Я поискал и ничего не нашел. Не стесняйтесь оскорблять и ругать меня, если я пропустил это.


person user1524220    schedule 13.07.2012    source источник


Ответы (2)


Мне приходилось делать это несколько раз. Самый простой подход, который я нашел, заключался в том, чтобы просто вычислить набор узлов на основе списка ссылок, а затем превратить его в массив для использования графом силы:

var links = [ .... ];
var nodeMap = {};
links.forEach(function(d, i) { 
    nodeMap[d.source] = true;
    nodeMap[d.target] = true;
});

var nodes = [];
for (key in nodeMap)
    nodes.push(key);

d3.layout.force()
         .nodes(nodes)
         .links(links);
person fozziethebeat    schedule 03.09.2012

Я сделал именно это в примере "D3, основанный на силовом направленном радиальном графике". Я делаю это, потому что хочу понять, как данные используются внутри, независимо от таких структур, как JSON и CSV, которые всегда можно добавить позже.

В любом случае, я надеюсь, что пример поможет вам.

Мой лучший,

откровенный

person Information Technology    schedule 29.07.2012