4

我有一个数据集,它定义了在力有向图中使用的许多节点。看起来像...

  var nodeSet = [
    {id: "N1", name: "Node 1", type: "Type 1", hlink: "http://www.if4it.com"},
    {id: "N2", name: "Node 2", type: "Type 3", hlink: "http://www.if4it.com/glossary.html"},
    {id: "N3", name: "Node 3", type: "Type 4", hlink: "http://www.if4it.com/resources.html"},
    {id: "N4", name: "Node 4", type: "Type 5", hlink: "http://www.if4it.com/taxonomy.html"},
    {id: "N5", name: "Node 5", type: "Type 1", hlink: "http://www.if4it.com/disciplines.html"}
  ];

如何专门告诉 d3.js 库中的 force.layout 使用 id = "N1" 的 "Node 1" 作为主根或焦点节点?

4

2 回答 2

3

如果您只想要一个根节点,您可以在对象中拥有一个根属性并将其设置为 true,而不是单独处理该节点。您还可以将此根设置为中心。以下是我们的做法(d3 + Prototype - 当时 - 现在切换到 d3+jQuery+underscore):

getCenter: function() {
    var center = {
        x : this.width / 2,
        y : this.height / 2
    };
    return center;
}

//later do something like this in your init method:
var first = {
                id : id,
                name : name,
                x : this.getCenter().x,
                y : this.getCenter().y,
                root : true,
                //other properties
            };

//later in your redraw() or other methods you might employ...
//try to find the root node later in the code using something like:
var rootNode = this.nodes.detect(function(node) {
    return node.root;
});

//do something to the root node after you have detected it...
if (rootNode) {
    rootNode.x = rootNode.px = this.getCenter().x;
    rootNode.y = rootNode.py = this.getCenter().y;
    //some other stuff...
}

我们就是这样做的。但是,我不清楚您的示例中的链接是什么……有点困惑。您会注意到,对于强制导向布局或更复杂的动画,您几乎总是需要使用 D3+其他东西(原型、jQuery、下划线)来实现简单的方法,例如检测或包含或其他类似的 Ruby 样式方法。

于 2012-06-05T22:39:33.003 回答
3

我不确定焦点或根节点是什么意思。如果您想在特定位置(例如中心)修复某个节点,您可以将其 'fixed' 属性设置为 true。有关详细信息,请参阅D3 Force-Directed Layout 中的 Fix Node Position 以及在 D3 中移动固定节点

我不认为您的力导向径向图示例确实表明 d3 隐式使用节点列表中的第一个节点作为“根”节点。由于网络结构,您示例中的节点 1 始终倾向于中心。如果稍后将节点 1 放置在节点数组中,则其行为是相同的。

于 2012-06-14T15:12:03.560 回答