我是d3js的新手,我在尝试将csv文件映射到强制布局的链接时遇到了一些问题。
这是我的csv文件:
node,edges,centrality_degree
1,"[(1, 2), (1, 3), (1, 4), (1, 5)]",1.0
2,"[(2, 1), (2, 3), (2, 4), (2, 5)]",1.0
3,"[(3, 1), (3, 2), (3, 4), (3, 5)]",1.0
4,"[(4, 1), (4, 2), (4, 3), (4, 5)]",1.0
5,"[(5, 1), (5, 2), (5, 3), (5, 4)]",1.0
我想将边缘值设置为d3.layout.force()的links属性,但是在映射值时,我收到错误:
未捕获的TypeError:无法读取未定义的属性'weight'
我不知道返回带有一堆对象的数组是否正确,这就是我在控制台上获得的内容。 5个数组,每个数组包含4个对象,每个对象都有源和目标属性。除5数组外,属性都是正确的。我得到了它的第一个源值的未定义值。它应该是5。
这是我的代码:
var force = d3.layout.force()
.size([w, h]);
d3.csv("{{ g }}", function(d) {
var nodes = d3.values(d.map( function(d){ return +d.node; } ));
var links_list = d.map( function(d) {
list_array = JSON.parse(d.edges.replace(/\(/g,"[").replace(/\)/g,"]"));
var i, len = list_array.length;
links = [];
for (i=0; i<len; i++) {
links.push({source: list_array[i][0] ,target: list_array[i][1] });
}
console.log(links);
#console result:
#[Object, Object, Object, Object]
#[Object, Object, Object, Object]
#[Object, Object, Object, Object]
#[Object, Object, Object, Object]
#expanding one array:
#0: Object
#1: Object
#2: Object
#3: Object
#[Object, Object, Object, Object]
#expanding the array[5][0] object:
#0: Object
#source: undefined
#target: 2
#__proto__: Object
});
force
.nodes(nodes)
.links(links)
.start();
...
});
我做错了什么以及为什么我收到这个错误?
感谢您的帮助。
答案 0 :(得分:1)
源和目标属性的值应指定为 索引到nodes数组;这些将被引用所取代 在强制召唤之后。
请注意,数组索引从0开始而不是从1开始。但是在csv的数据中,您有(5, 1), (5, 2), (5, 3), (5, 4)
之类的链接,而您的nodes数组只有5个元素;最后一个元素的索引是4.您应该将这些数字减少为1以表示实际节点。
例如:
var nodes = [{ name: "A", id: 1},{ name: "B", id: 2}];
强制布局需要链接数组,如下所示。
var links = [{ source:0, target: 1 }];
希望你遇到问题。您必须按照以下所示方式获取实际指数。
for (i=0; i<len; i++) {
links.push({source: list_array[i][0]-1 ,target: list_array[i][1]-1 });
}