在Hobbelt" Group / Bundle Nodes"中添加标签到节点D3力布局的例子?

时间:2015-03-03 15:50:55

标签: javascript svg d3.js label force-layout

我改编了Ger Hobbelt的群组/捆绑节点的优秀示例 https://gist.github.com/GerHobbelt/3071239

作为JSFiddle:

https://jsfiddle.net/NovasTaylor/tco2fkad/

显示屏显示可折叠节点和区域(外壳)。

我想到的一个调整是如何向扩展节点添加标签。我已经使用类似于以下的代码成功地在我的其他力网络图中向节点添加了标签:

nodes.append("text")
     .attr("class", "nodetext")
     .attr("dx", 12)
     .attr("dy", ".35em")
     .text(function(d) {
         // d.name is a label for the node, present in the JSON source
         return d.name;
     });  

是否有人熟悉Ger的例子来指导我朝着正确的方向前进?

1 个答案:

答案 0 :(得分:5)

在输入时,不是附加circle,而是g附加circletext。然后重新计算一点以修复g而不是circle的移动。最后,只有当节点有一个名字(意思是它的叶子)时才追加写.text()

node = nodeg.selectAll("g.node").data(net.nodes, nodeid);
node.exit().remove();
var onEnter = node.enter();   
var g = onEnter
  .append("g")
  .attr("class", function(d) { return "node" + (d.size?"":" leaf"); })
  .attr("transform", function(d) { 
      return "translate(" + d.x + "," + d.y + ")"; 
  });   
g.append("circle")
  // if (d.size) -- d.size > 0 when d is a group node.      
  .attr("r", function(d) { return d.size ? d.size + dr : dr+1; })
  .style("fill", function(d) { return fill(d.group); })
  .on("click", function(d) {
    expand[d.group] = !expand[d.group];
    init();
  });  
g.append("text")
  .attr("fill","black")
  .text(function(d,i){
    if (d['name']){          
      return d['name'];
    }
});

并重构勾选以使用g代替圈子:

 node.attr("transform", function(d) { 
   return "translate(" + d.x + "," + d.y + ")"; 
 });

更新了fiddle