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, а не индекс, который он имеет в массиве?
Ответы
Ответ 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.