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
Javascript D3.js将父对象粘贴在svg的中间_Javascript_Svg_D3.js_Force Layout - Fatal编程技术网

Javascript D3.js将父对象粘贴在svg的中间

Javascript D3.js将父对象粘贴在svg的中间,javascript,svg,d3.js,force-layout,Javascript,Svg,D3.js,Force Layout,我修改了可折叠力布局示例: …现在看起来是这样的 所有圆圈现在都可拖动我想将中间的圆圈(蓝色圆圈)粘贴到svg的中间。可能吗?多谢各位 <script> var width = 960, height = 600, root; var force = d3.layout.force() .linkDistance(175) .charge(-200) .gravity(0)

我修改了可折叠力布局示例:

…现在看起来是这样的

所有圆圈现在都可拖动我想将中间的圆圈(蓝色圆圈)粘贴到svg的中间。可能吗?多谢各位

<script>

    var width = 960,
        height = 600,
        root;

    var force = d3.layout.force()
        .linkDistance(175)
        .charge(-200)
        .gravity(0)
        .size([width, height])
        .on("tick", tick);

    var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height);

    var link = svg.selectAll(".link"),
        node = svg.selectAll(".node");

    d3.json("graph.json", function(error, json) {
      root = json;
      update();
    });

    function update() {
      var nodes = flatten(root),
          links = d3.layout.tree().links(nodes);

      // Restart the force layout.
      force
          .nodes(nodes)
          .links(links)
          .start();

      // Update links.
      link = link.data(links, function(d) { return d.target.id; });

      link.exit().remove();

      link.enter().insert("line", ".node")
          .attr("class", "link");

      // Update nodes.
      node = node.data(nodes, function(d) { return d.id; });

      node.exit().remove();

      var nodeEnter = node.enter().append("g")
          .attr("class", "node")
          .on("click", click)
          .call(force.drag)
          .attr("href", function(d) { return d.link; });

    nodeEnter.append("svg:a")
      .attr("xlink:href", function(d){return d.link;})
      .append("circle")
          .attr("r", function(d) { return Math.sqrt(d.size) / 10 || 4.5; });

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

      node.select("circle")
          .style("fill", color);
    }

    function tick() {
      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; });

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

    function color(d) {
      return d._children ? "#3182bd" // collapsed package
          : d.children ? "#2F9BC1" // expanded package
          : "#fd8d3c"; // leaf node
    }

    // Toggle children on click.
    function click(obj) {
      if (d3.event.defaultPrevented) return; // ignore drag
      if (d.children) {
        d._children = d.children;
        d.children = null;
      } else {
        d.children = d._children;
        d._children = null;
      }
      update();
    }

    // Returns a list of all nodes under the root.
    function flatten(root) {
      var nodes = [], i = 0;

      function recurse(node) {
        if (node.children) node.children.forEach(recurse);
        if (!node.id) node.id = ++i;
        nodes.push(node);
      }

      recurse(root);
      return nodes;
    }

    </script>

为此,您需要在将节点的坐标设置为中心后,将该节点的
fixed
属性设置为
true
(请参见),如下所示

nodes.forEach(function(d) {
   if(d._children || d.children) {
     d.x = width/2, d.y = height/2;
     d.fixed = true;
   }
});
更新
功能开始时立即执行

如果还想禁用该节点的拖动,可以执行以下操作:

nodeEnter.filter(function(d) {
           return d.children === undefined && d._children === undefined;
         })
         .call(force.drag);

不要调用
force。在所有节点上拖动
。完整示例。

谢谢。附加此码后,中间圆固定,但不在中间。重新加载页面时,位置会随机变化。我想禁用中间圆拖动效果。这是一个完美的答案。非常感谢你的大力帮助。
nodeEnter.filter(function(d) {
           return d.children === undefined && d._children === undefined;
         })
         .call(force.drag);