graph - D3 : Force Layout with fixed Y ranges - Reducing link overlap

标签 graph d3.js force-layout

我创建了一个图表,其中每个节点都适合一个固定的 y 范围。我正在使用强制布局来显示图形,但我不知道如何确保出现最少的交叉链接 - 一些交叉是不可避免的。我认为它是重力、力、linkDistance 等的组合,但我的更改似乎都不起作用

图表位于: http://plnkr.co/edit/wyWjk37mkDCWcwpZvzxe?p=preview

理想的配置是 enter image description here

但结果往往一团糟: enter image description here

任何想法将不胜感激

最佳答案

看看这个example .

这是您的示例,但稍作修改。基本思想是分两次进行强制布局:

  • 首先将允许更宽松的布局方式:节点将被允许偏离它们的“水平”;这将允许自发地跳过另一个以获得更好的链接布局(更少的交叉点)
  • 第二个将节点“返回”到它们各自的级别

代码的关键部分:

自定义力:

  graph.nodes.forEach(function(o, i) {
    o.y += (y(o.level) - o.y) * k; 
  });

布局定义:

  var force = d3.layout.force()
    .charge(-1000)
    .gravity(0.2)
    .linkDistance(30)                    
    .size([width, height])

调用 force.start() 两次:

force
  .nodes(graph.nodes)
  .links(graph.links)
  .on("tick", tick)
  .start();

setTimeout(function() {
  first = 0;
  force.start();
}, 6000);  

变量“第一”:

首先变量 = 1;

  if(first) {
    var k = e.alpha;
  }
  else{
    var k = 10 * e.alpha;
  }

第一次通过后的截图:

enter image description here

第二次通过后:

enter image description here

我会尝试改进这个例子,这是一个有点“肮脏”的开发原型(prototype),但我现在没有时间,也许明天吧。

编辑:注意:我只是注意到实际上数据是恒定的,但是,布局因模拟而异。这不一定是那样的。它可以更具确定性。我明天也会尝试解决这个问题。我还将使用“结束”事件更好地链接布局。

关于graph - D3 : Force Layout with fixed Y ranges - Reducing link overlap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598092/

相关文章:

javascript - Highcharts 带向下钻取的柱形图,从 x 轴标签中删除格式等超链接

javascript - d3 在折线图上的最高值和最低值上添加圆圈

javascript - D3访问嵌套数据

javascript - 添加另一个 js 文件中存在的方法的事件监听器

javascript - d3 力定向网络的 json 表示

javascript - 以编程方式确定 SVG 路径生成的形状

graph - 如何在 JanusGraph 中解耦多个图实例

java - 反转有向加权图中的边

javascript - 在 D3JS 中更新文本标签