如何使用 d3 v4 设置固定链接距离

Posted

技术标签:

【中文标题】如何使用 d3 v4 设置固定链接距离【英文标题】:how do you set a fixed link distance with d3 v4 【发布时间】:2017-01-07 17:22:36 【问题描述】:

所有 API 示例似乎仍然适用于 v3。 我试图了解如何使用固定距离的链接创建力图,例如: http://bl.ocks.org/d3noob/5141278

我查看了 link_distance 但不知道如何应用它: https://github.com/d3/d3-force/blob/master/README.md#link_distance

创建这样的图表:

  let simulation = d3.forceSimulation()
      .force("link", d3.forceLink().id(function(d)  return d.id; ))
      .force("charge", d3.forceManyBody().strength(-150))
      .force("center", d3.forceCenter(width / 2, height / 2));

我尝试了各种组合,例如:

  // .force("link", d3.forceLink().distance(20).strength(1))
  // .force("linkDistance", 20)
  // .force("link", d3.forceLink().id(function(d)  return d.id; ))

但没有运气!

所以看起来 link_distance 无法修复? 这是力量和(距离,不管是什么)的结果

那么如何将 strengthdistance 应用于 d3 v4 中的链接? 是应用于模拟还是其他?

【问题讨论】:

D3 v3 和 v4 都没有固定链接距离。看看我的answer 到"d3.js linkStrength influence on linkDistance in a force graph" 以获得对 v3 的解释。尽管发生了很大的变化,尤其是在部队布局方面,但同样的原则也适用于 v4。如果链接看起来具有相同的长度,这是偶然的,并且主要受周围其他参数和力的影响。 好的,谢谢。但我仍然不清楚如何使用 v4 API 设置 linkDistance 或 linkStrength 命令。我是把这些设置在d3.forceSimulation 还是其他东西上? 是的,寻找 v4 和 v3 有点挑战。我会推荐两件事:1)仅在 blockbuilder.org/search#d3version=v4 上搜索 V4(直到很晚才找到)。 2)我的非平凡 d3 力图:bl.ocks.org/bill-mybiz/dfe5b70ad9b469e23b8820790fa53109。我这样做是为了一个重要的参考实现,因为不断遇到 v3 文档有点令人沮丧。它使用节点组(不仅仅是简单的圆圈)、es6 类结构等来动态添加/删除节点。它包括设置距离,以及一系列其他设置。 【参考方案1】:

在 v4 中你更接近于改变距离!检查此更改...它对我有用:

    var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d, i)  return i; ).distance(100).strength(1))
    .force("charge", d3.forceManyBody())
    .force("center", d3.forceCenter(width / 2, height / 2));

原始代码几乎是正确的。但是,需要将i 添加到函数中,并且还需要返回i 才能更改链接距离。我编辑了原始代码以反映这一点。请看这个链接:Link to Free Code Camp

【讨论】:

【参考方案2】:

你快到了...检查一下,这段代码对我有用..

注意:我使用此代码根据节点标签动态获取链接长度 GetNodeDefaults(d.label).linkDistance 即,它可以是 100 或 200或 300 等,

var forceLink = d3
    .forceLink().id(function (d) 
        return d.id;
    )
    .distance(function (d) 
        return GetNodeDefaults(d.label).linkDistance;
    )
    .strength(0.1);

var simulation = d3.forceSimulation()
    .force("link", forceLink)
    .force("charge", d3.forceManyBody().strength(function (d, i) 
        var a = i == 0 ? -2000 : -1000;
        return a;
    ).distanceMin(200).distanceMax(1000))
    .force("center", d3.forceCenter(width / 2, height / 2))
    .force("y", d3.forceY(0.01))
    .force("x", d3.forceX(0.01))
    .on("tick", ticked);

【讨论】:

【参考方案3】:

您可以尝试不使用force('center')

let simulation = d3.forceSimulation()
  .force("link", d3.forceLink().id(function(d)  return d.id; ))
  .force("charge", d3.forceManyBody().strength(-150));

【讨论】:

以上是关于如何使用 d3 v4 设置固定链接距离的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 d3 v4 读取 CSV?

如何在 d3.v4 中使用 JSON 数据创建树布局 - 没有分层()

在 D3 v4 中替换 d3.transform

D3js v4。如何确定自定义事件?

如何增加 D3 可折叠树中子节点之间的距离?

使用d3.js滚动时如何将x轴保持在固定位置?