20

我尝试以这种方式同时设置节点和链接:

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 合作?

我正在阅读文档,显然源和目标必须是节点数组中节点的索引。有没有办法改变它?那么,我可以使用节点的名称而不是它在数组中的索引吗?

4

6 回答 6

18

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

于 2013-09-26T09:41:05.677 回答
12

除了在链接的源/目标中提到 null 的答案之外,其原因可能是分配了超出范围的源/目标。例如,您有 10 个节点,并且您将目标分配为第 11 个索引节点。

于 2014-03-15T18:39:24.593 回答
12

力导向布局使用边缘权重来计算布局。"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 源中)以使用任何属性/类型。

于 2012-07-07T14:52:52.030 回答
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();
于 2015-04-13T12:43:57.223 回答
5

我认为您的源和目标中可能有空值。我也有这个错误,并通过过滤掉空值来修复它。

于 2013-07-12T17:55:12.850 回答
2

我已经以多种方式弹出了这个问题。最近,我的边缘列表如下:

{Source: 0; Target: 1}

代替:

{source: 0, target: 1}
于 2014-01-21T20:48:18.860 回答