Подтвердить что ты не робот

D3.js: "Невозможно прочитать свойство" вес "undefined" при ручном определении обоих узлов и ссылок для компоновки силы

Я попытался установить оба узла и ссылки в одно и то же время следующим образом:

var force = d3.layout.force()
    .size([w, h])
    .nodes(nodes)
    .links(connections)
    .start();

nodes = [{"name":"data_base_id", "kind":"subgenre"},...]
connections = [{"source":"name_of_node", "target":"name_of_other_node"},...]

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

Cannot read property 'weight' of undefined

И когда я комментирую .links(connections), граф отображает (выкладывает кучу точек, разбросанных по всему...) Как мне получить соединения/ссылки для сотрудничества с d3?

Я читал документы, и, видимо, источником и целью должны быть ИНДЕКСЫ узлов в массиве узлов. Есть ли способ изменить это? Итак, я могу использовать имя node, а не индекс, который он имеет в массиве?

4b9b3361

Ответ 1

Ориентированная на усилие компоновка использует вес ребер для вычисления макета. Попробуйте добавить фиктивный "weight":1 ко всем вашим соединениям.

Код, инициализирующий ссылки, выглядит следующим образом:

links.forEach(function(d) {
    if (typeof d.source == "number") { d.source = nodes[d.source]; }
    if (typeof d.target == "number") { d.target = nodes[d.target]; }
});

Предположительно вы можете настроить это (в источнике d3) на использование любого свойства/типа.

Ответ 2

Я столкнулся с такой же проблемой раньше, это связано с тем, что в источнике/цели ссылок есть нулевые значения. распечатать узлы и ссылки информация может помочь отладить

Ответ 3

В дополнение к ответам, в которых упоминается нуль в источнике/цели ссылок, причиной этого может быть назначение источника/цели вне диапазона. Например. у вас есть 10 узлов, и вы назначаете цель 11-м индексированным node.

Ответ 4

Благодаря ответам выше, которые относятся к нулевым исходным или целевым значениям!

Я тестировал график из http://bl.ocks.org/mbostock/4062045 и обнаружил, что мои данные ссылаются на отсутствующий node.

Это может помочь другим отладить эту проблему:

d3.json("my-buggy-data.json", function(error, graph) {

    // Find blank links, which give the error
    // "Uncaught TypeError: Cannot read property 'weight' of undefined"
    graph.links.forEach(function(link, index, list) {
        if (typeof graph.nodes[link.source] === 'undefined') {
            console.log('undefined source', link);
        }
        if (typeof graph.nodes[link.target] === 'undefined') {
            console.log('undefined target', link);
        }
    });

    force
        .nodes(graph.nodes)
        .links(graph.links)
        .start();

Ответ 5

Я думаю, что у вас могут быть нулевые значения в вашем источнике и цели. У меня тоже была эта ошибка, и я исправил ее, отбросив нулевые значения.

Ответ 6

У меня эта проблема возникла несколькими способами. Совсем недавно у меня был список ребер следующим образом:

{Source: 0; Target: 1}

вместо:

{source: 0, target: 1}

Ответ 7

У меня была такая же проблема. Мои узлы не начинались с идентификатора 0.