【问题标题】:How do you customize the d3 link strength as a function of the links and nodes counts ? (d3 v4)您如何根据链接和节点数自定义 d3 链接强度? (d3 v4)
【发布时间】:2017-01-15 16:47:13
【问题描述】:

我正在尝试编写自己的函数来衡量 d3 v4 Force 有向图的链接。

默认强度函数是here,根据readme,可以通过传递一个新函数作为参数来更改它。 (请注意,readme 中的函数与实际代码中的函数略有不同)。

这是我想要工作的代码部分:

 var simulation = d3.forceSimulation()
            .force("link", d3.forceLink()
                    .distance(60)
                    .id(function (d) { return d.name;})
                    .strength( function (link) {/* my code here */}))

我已尝试将评论替换为默认评论:

function (link) { return 1 / Math.min(count[link.source.index],
                                      count[link.target.index]); }

没有成功。

【问题讨论】:

  • count 无法从提供给.strength() 的回调中访问。此变量由d3.forceLink() 在内部使用,但未公开。它可能有助于指定您希望通过代码实现的目标,以帮助您找到手头的解决方案。
  • 是的,我意识到有点晚了...我能够使它与1 / Math.min(d.source.size, d.target.size) 一起工作,因为我的节点有一个size 属性来替换该计数。感谢您的回答

标签: d3.js graph hyperlink force-layout


【解决方案1】:

从您提供的示例中很难判断,但您需要将哪些链接传递给模拟 forceLink 函数。如果您的示例实际上成功地构建了链接,您可能会考虑将计算外部化,然后从内部链接调用该函数:这是一个适用于我的示例。

 var weightScale = d3.scaleLinear()
.domain(d3.extent(edges, function (d) { return d.weight }))
.range([.1, 1])


graph = d3.forceSimulation()
.nodes(nodes)
.force("charge", d3.forceManyBody()
  .strength(-75)  // -1000
  .distanceMax([250]))    
.force("link", d3.forceLink()
    .links(edges)
    .id(function(d) { return d.index })
    .strength (function (d) {return weightScale(d.weight)})
    .distance(55))
.force("center", d3.forceCenter(250, 250)) //  width / 2, height / 2
.on("tick", forceTick);

我在链接权重上使用比例 weightScale,在 .strenght 内部调用。 您可以像这样传递链接:

.force("link", d3.forceLink(*YOURLINKS*)

或者这个:

.force("link", d3.forceLink()
  .links(*YOURLINKS*)

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2019-04-02
    • 2020-03-25
    • 2018-02-18
    • 2019-09-04
    • 2014-08-01
    相关资源
    最近更新 更多