d3.js - 具有嵌套g节点的circle pack布局

时间:2013-02-12 14:50:05

标签: javascript svg d3.js hierarchy circle-pack

我正在尝试实现圆形打包示例:http://bl.ocks.org/4063530 - 但我希望它使用嵌套的“g”节点,因此更容易设置和控制每个圆的子项的可见性 - 但在此示例中,所有节点都在dom中的相同深度。我该如何筑巢?或者,如果没有嵌套,我如何只选择圆的直接子项(并非所有圆的所有子项)。我目前修改了示例以添加具有对象深度的类,如下所示:

d3.json("skills.json", function(error, root) {
  var node = svg.datum(root).selectAll(".node")
    .data(pack.nodes)
    .enter().append("g")
      .attr("class", function(d) { return "node node"+ d.depth; })

现在想要这样做:

d3.selectAll(".node1").on("mouseover",function(){
    d3.select(this).classed("active",true).//SELECT ALL CHILDREN OF THE HOVERED NODE HERE

有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

pack数据之后,我无法想出一种嵌套g元素的方法,所以这是一个不那么优雅的解决方案:

  function checkParent(d, w) {
      if(!d.parent) return false;

      if(d.parent == w) {
        return true;
      } else {
        return checkParent(d.parent, w);
      }
  }

  node.on("mouseover",function(d){
      d3.select(this).classed("active",true);
      d3.selectAll(".node")
          .filter(function(w){ return checkParent(w, d); })
          .classed("active",true);
  });

  node.on("mouseout",function(d){
      d3.select(this).classed("active",false);
      d3.selectAll(".node")
          .filter(function(w){ return checkParent(w, d); })
          .classed("active",false);
  });

http://bl.ocks.org/4771875