【问题标题】:Apply force to entering nodes only in d3.js仅在 d3.js 中强制输入节点
【发布时间】:2013-06-12 12:18:40
【问题描述】:

我在 D3 中使用强制定向布局,并可选择暂停它。但是,即使图形的其余部分应该保持静态,我也想布局输入节点。我尝试将力算法应用于输入节点,如下所示:

nnodes = vis.selectAll(".node")
  .data(updatedData.nodes)
nlinks = vis.selectAll(".link")
  .data(updatedData.links)

// apply graphics to entering nodes and links

force
  .nodes(nnodes.enter())
  .links(nlinks.enter())
  .start()
force.on("tick", tick)

tick 在应用于完整图形或用户拖动节点时正确设置节点和链接位置。

但是,使用上面的代码,新节点不会超出它们的初始位置。

我能否以某种方式仅将强制算法应用于输入节点?

【问题讨论】:

    标签: d3.js force-layout


    【解决方案1】:

    力布局通过考虑所有节点和链接来计算节点位置。你不能真正将它应用于图表的一部分。所以你需要做的是修改现有力布局的节点和链接,而不是只给它新的。要使已经存在的节点保持原位,请尝试在它们上设置fixed 属性。

    您的代码将如下所示:

    nodes.forEach(function(n) { n.fixed = true; });
    
    // update graphics
    
    newNodes.forEach(function(n) { nodes.push(n); });
    // add new links similarly
    
    force.start();
    

    【讨论】:

    • 这让我的计划比我想象的更难。我是否正确理解 nodeslinks on force 方法基本上只是告诉 d3 节点/链接存储在哪个变量中,而不一定哪些节点应该受到力的影响?我想在某种程度上这是有道理的,因为其他节点可能应该像往常一样行使他们的力量,只是不要移动自己,即fixed
    • 不,nodeslinks 告诉 D3 力布局应该作用于什么。这与绘制的节点/链接不同——这是单独处理的。
    猜你喜欢
    • 2017-08-27
    • 2013-10-17
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多