javascript - D3 强制布局移动树中的分支而不是节点

标签 javascript d3.js

我有一棵树和叶子之间的附加链接。我想对这些节点应用力布局,以便分支被迫靠近在一起。不是单独的节点(应保留树布局)。

因此,对于下图,我希望从 7 和 4 开始的分支交换位置,以便节点 5 和 0 变得更接近。到目前为止,我只将单独的节点移动到一起。请参阅下面的另一张图片。

这里是jsfiddle link您能否建议使用强制布局更改分支位置的最佳方法?

enter image description here

enter image description here

我仅在某些节点上应用了强制布局:

// assign special type on creation/////////////////////////////////////
var ind1 = 0;
var ind2 = 5;
nodes.forEach(function(d, i) {
  if (i ==  ind1 || i == ind2) {
    d.dataType = 'special';
  } else {
    d.dataType = 'none';
  }
}
)
// draw path between special nodes/////////////////////////////////////
var nodeS = nodes[ind1];
    var nodeT = nodes[ind2];
    var newLink = {source: nodeS, target: nodeT};
    specialLinks.push(newLink);
    nodesSelected.push(nodeS);
    nodesSelected.push(nodeT);

    linkSel = svg.selectAll('path.linkExtra').data(specialLinks);
    nodeSel = svg.selectAll('g.node').filter(function(d,i){
      return d3.select(this).attr('data-type') == 'special';
    })

    linkSel.enter().append('path')
        .attr('class', 'linkExtra')
        .attr('d', d3.svg.diagonal().projection(function(d) {
          return [d.y, d.x];
        }));

// create force layout/////////////////////////////////////
var force = d3.layout.force()
  .gravity(0)
  .charge(20)
  .linkDistance(100)
  .linkStrength(1)
  .size([500, 500]);



 // main function to apply forces/////////////////////////////////////
     function inittForce() { 
    force
        .nodes(nodesSelected)
        .links(specialLinks)
         .start();


    force.on('tick', function(e) {

      linkSel.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; });

      nodeSel.attr('cx', function(d, i) {return  d.x;})
          .attr('cy', function(d) { return d.y; });

      svg.selectAll('*').remove();
      drawTree();
      drawPath();
    });
  }

最佳答案

我认为强制布局与层次结构布局在这里不起作用。

我希望以编程方式预处理数据,以便发送到分层布局的数据根据​​其连接性进行排序。对于您的示例,我交换了几个 treeData 数组元素以获得效果。

http://jsfiddle.net/1ahutwvp/39/

关于javascript - D3 强制布局移动树中的分支而不是节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938178/

相关文章:

d3.js - c3.js 带有百分比 y 轴的时间序列图

javascript - 一页上有多个 svg 的 D3 单击事件

javascript - HTML5 Canvas - 按类在所有 Canvas 元素中绘制相同的内容

javascript - IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件

javascript - 如何在javascript中定位外部div

javascript - d3js 中力导向图像和标签布局中的不同图像尺寸

javascript - 带有 eB YouTube 视频的画廊

javascript - 在 Chrome 中处理 "Enter"/"Return"键

d3.js - 如何通过用户交互在 d3.js 中绘制直线

javascript - D3js 和基于百分比的变量