d3.js:“不能读取属性‘重’的未定义”手动定义为力布局节点和链接时

问题描述 投票:18回答:6

我试图在同一时间这样设定两个节点和链接:

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(连接)的图形渲染(只是一堆散落各处的点...)我如何获得的连接/链路与D3进行合作?

我正在读的文档,显然,源和目标必须是节点阵列中的节点索引。反正是有改变这种状况?所以,我可以用一个节点,而不是它在阵列中的索引的名称?

graphics graph d3.js force-layout
6个回答
10
投票

该力指向布局使用的边权重来计算的布局。尝试添加一个虚拟"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源)使用任何属性/类型。


18
投票

我以前遇到同样的问题,这是由于存在链接源/目标空值。打印出的节点和链接的信息可能有助于调试


11
投票

除了答案提的链接的源/目标空,这样做的原因可能是超出范围的源/目标的分配。例如。你有10个节点和分配目标是第11个索引节点。


10
投票

由于其上方指空源或目标值的答案!

我一直在测试了从http://bl.ocks.org/mbostock/4062045图,并发现我引用的数据丢失节点。

这可以帮助别人调试这个问题:

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
投票

我想你可能在你的源和目标空值。我有这个错误也和过滤掉空值固定它。


2
投票

我有这个问题在许多方面弹出。最近,我有我的优势名单如下:

{Source: 0; Target: 1}

代替:

{source: 0, target: 1}
© www.soinside.com 2019 - 2024. All rights reserved.