【问题标题】:D3 force layout: individually positioning first and last nodeD3力布局:分别定位第一个和最后一个节点
【发布时间】:2015-09-21 02:54:18
【问题描述】:

我想创建一个静态力导向布局,如本例中的那样:http://bl.ocks.org/mbostock/1667139,但第一个和最后一个节点锚定在窗口的每一侧(与示例相反,我的图不是圆形的)。通过这种方式,我可以清楚地看到图表的开始和结束位置,并希望能够赋予它更线性的构象。 到目前为止,我已经尝试为这两个节点分配不同的类,然后给这些类固定坐标,例如:

svg.select(".first")
  .attr("cx", function(d) { return 10; })
  .attr("cy", function(d) { return height/2; })

svg.select(".last")
  .attr("cx", function(d) { return width-10; })
  .attr("cy", function(d) { return height/2; })

但它似乎不起作用,两个节点只是坐在窗口的右上角。有什么想法吗?

【问题讨论】:

    标签: d3.js position nodes force-layout


    【解决方案1】:

    for 循环和force.stop() 之间放置以下代码对我来说似乎很好。

    var nodes = force.nodes();
    nodes[0].x = 10;
    nodes[0].y = height/2;
    
    nodes[nodes.length-1].x = width-10;
    nodes[nodes.length-1].y = height/2;
    

    这是一个 Fiddle 显示此内容。您可能还想查看 fixed 属性,这可能有助于您寻找的行为。

    【讨论】:

    • 谢谢,这确实是一个聪明的解决方案。然而,其余节点不受此影响:例如无论如何,第二个节点仍然保留在原处,它不会被拉向左侧。有什么想法可以解决这个问题,让它们的布局看起来更自然一点?
    • @Balloon Fiddle。在这一个中,节点在布局初始化之前定位和固定,这不太可能导致问题(初始化后修复不是那么简单)。还将gravity 参数添加到布局初始化中。默认为0.1,减少它会导致更多传播。默认情况下,固定节点相当远,但是否更改它取决于您希望它的布局方式。
    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 2015-07-14
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2013-04-25
    相关资源
    最近更新 更多