2014-02-14 45 views
1

I am referring to example shown thereD3.js从节点构建链接?

我无法理解d3.js如何从节点创建链接。让我解释我的理解: 我们有一个js对象从代表json的文件中读取的根;我们递归地获取节点并给出ID。 但后来发生的一部分,我不明白。 d3.layout.tree()。​​链接函数如何返回链接?我们只通过节点来运作,那就是ids和节点的坐标?

d3.json("graph.json", function(error, json) { 
    root = json; 
    update(); 
    }); 
    function update() { 
    var nodes = flatten(root), 
    links = d3.layout.tree().links(nodes); 

回答

3

树布局通过采用分层数据结构(在JSON中指定)并使链接显式来构造链接。 JSON中的节点具有children属性,隐含指定哪些节点已连接。节点连接到他们的孩子,而这些节点又连接到他们的孩子和父母。树布局用来计算链接的是这些信息。

的说:

鉴于节点,诸如那些由节点返回的指定的数组,返回表示从父到子链路为每个节点的对象的阵列。叶节点不会有任何链接。每个链接是具有两个属性的对象:

source - 父节点(如上所述)。

target - 子节点。

该方法对于检索适合显示的一组链接描述很有用。

请注意,使用children属性来存储子项仅仅是您可以更改的默认值,如果您愿意的话。

+0

+1 Lars的回答比我的好得多。我经常得到他的帮助;阿布扎尔,我会记下他的答案! – ericmjl

1

update()功能,links = d3.layout.tree().links(nodes);是“选择”树在JSON文件其指定的链接节点。

我觉得这里的关键是在JSON文件中的,不仅应该有节点,而且应该有指定的链接。否则,只能得到节点。我相信this page也应该有所帮助。

至于后来发生了什么代码,如果它是有帮助的,请继续往下看......

后来,现有链接树link = link.data(links, function(d) { return d.target.id; });更新。

稍后,下面的代码块会输入当前不存在于图表中的新链接。

// Enter any new links. 
    link.enter().insert("line", ".node") 
     .attr("class", "link") 
     .attr("x1", function(d) { return d.source.x; }) 
     .attr("y1", function(d) { return d.source.y; }) 
     .attr("x2", function(d) { return d.target.x; }) 
     .attr("y2", function(d) { return d.target.y; }); 

我希望这有助于!

+0

你的意思是说d3.layout.tree()。​​links()函数是指从文件中读取的一些全局属性来查找链接? –