Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使svg遵循分层结构_Svg_D3.js - Fatal编程技术网

使svg遵循分层结构

使svg遵循分层结构,svg,d3.js,Svg,D3.js,我是d3新手,我想知道是否有可能使svg遵循树的层次结构 假设我有这样一个json: { "name": "root", "children": [ { "name" : "child1", "children": [ { "name": "child1_1" },

我是d3新手,我想知道是否有可能使svg遵循树的层次结构

假设我有这样一个json:

{
       "name": "root",
       "children": [
           {
               "name" : "child1",
               "children": [
                   {
                       "name": "child1_1"
                   },
                   {
                       "name": "child1_2"
                   }
               ]
           },
           {
               "name": "child2",
               "children": [
                   {
                  "name": "child2_1"
                   },
                   {
                       "name": "child2_2"
                   }
               ]
           }   
        ]
}
var w = 960,
    h = 2000,
    i = 0,
    root;

var diagonal = d3.svg.diagonal()
    .projection(function(d) { return [d.y, d.x]; });

var vis = d3.select("#chart").append("svg:svg")
    .attr("width", w)
    .attr("height", h)
    .append("svg:g")
    .attr("transform", "translate(40,0)");

d3.json(
    './small_tree.json',
    function(json) {
        json.x0 = 800;
        json.y0 = 0;
        update(root = json);
    }
);
function update(source) {

    var nodes = tree.nodes(root);
    var child = vis.selectAll('g.child_node')
        .data(nodes,function(d){return d.children;})
        .enter()
        .append('g')
        .attr("class", "child_node");
}
我如何拥有这样的svg结构:

<g class="root">
  <g class="child1">
    <g class="child1_1">
    </g>
    <g class="child1_2">
    </g>
  </g>
  <g class="child2">
    <g class="child2_1">
    </g>
    <g class="child2_2">
    </g>
  </g>
</g>
我得到了根节点的子节点的标记,但我不知道如何递归地为子节点的子节点创建嵌套组

有人有主意吗

谢谢


Rem

D3并不以本机方式处理递归,而且看起来标准分层布局一般不会创建嵌套结构。相反,您需要在自己的代码中递归。下面是一个实现:

// simple offset, just to make things visible
var offset = 0;

// recursion function
function addNode(selection, depth) {
   // set the current children as the data array
   var nodeGroup = selection.selectAll('g.child_node')
       .data(function(d) { return d.children })
     .enter()
       // add a node for each child
       .append('g')
       .attr("class", "child_node")
       // very simple depth-based placement
       .attr("transform", "translate(" + (depth * 30) + "," +
            (++offset * 15) + ")");

    nodeGroup.append("text")
       .attr("dy", "1em")
       .text(function(d) { return d.name });

    // recurse - there might be a way to ditch the conditional here
    nodeGroup.each(function(d) {
        if (d.children) nodeGroup.call(addNode, depth + 1);
    });
}

d3.json(
    './small_tree.json',
    function(root) {
        // kick off the recursive append
        vis
            .datum({ children: [root] })
            .call(addNode, 0);
    }
}

看小提琴:

你自己试过什么了吗?如果这只是一个“为我做”的问题,而不是“我对这段代码有问题,请帮我解决”的话,你不可能得到任何答案。对不起,我应该从这开始…非常感谢你的帮助!!你认为这样的组织在为一棵大树折叠子树时会有助于提高性能吗?我不确定。大多数D3树处理实际上使用了一个平面列表,并简单地将事物放置在分层布局中,而不是嵌套结构中——不确定哪一个性能更好。