“Pinning"D3力向图中的节点
"Pinning" nodes in a D3 force-directed graph
我构造了一个规则的"网格",它将节点放置在网格上间隔均匀的点上。然后,通过随机化linkDistance,我可以"搅动"网格,使其不那么规则。
我想"固定"所有的边缘点,这样它们就不会移动——只留下内部的点受力布局的影响。
我的见解是,因为这是一个规则的四边形网格,任何权重小于4的点都是一个"边缘"点,因此应该被固定。
我认为权重只有在将节点和链接添加到force layout后才会计算出来,所以我通过nodes
数组进行forEach
ing,将其添加到force layout后,并根据权重有条件地设置fixed
属性。
然后,我重新应用nodes
属性和start
模拟。
。在这个例子中,我附加了所有移动的点。
force = d3.layout.force()
.size( [w, h ] )
.nodes( nodes )
.links( links )
.linkDistance( function( d ){ return Math.random() * GRID_SPACING; } )
.linkStrength( 1 )
.charge( 0 )
.gravity( 0 )
.friction( .5 )
.on( "tick", function() {
d3links.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
d3nodes.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
} );
// "Pin" all the edge nodes.
nodes.forEach( function( node ){
if ( node.weight < 4 ){
node.fixed = true;
}
} );
force.nodes( nodes ).start();
你的见解很好!但时机就是一切……
"start"事件是在权重初始化之后触发的,所以这应该可以工作…
force = d3.layout.force()
.size([w, h])
.nodes(nodes)
.links(links)
.linkDistance(function (d) { return Math.random() * GRID_SPACING; })
.linkStrength(1)
.charge(0)
.gravity(0)
.friction(.5)
.on("tick", function () {
d3links.attr("x1", function (d) { return d.source.x; })
.attr("y1", function (d) { return d.source.y; })
.attr("x2", function (d) { return d.target.x; })
.attr("y2", function (d) { return d.target.y; });
d3nodes.attr("cx", function (d) { return d.x; })
.attr("cy", function (d) { return d.y; });
})
.on("start", function () {
// "Pin" all the edge nodes.
nodes.forEach(function (node) {
if (node.weight < 4) {
node.fixed = true;
}
});
})
force.nodes(nodes).start();
(如果你想包含拖动行为,那么你也需要在拖拽结束后重新修复)
相关文章:
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- d3使用链接的节点名称的力图
- 当我在节点上拖动鼠标时,我如何防止使用d3.ehavior.zoom().on(“缩放”,重绘)
- 如何使d3.js树布局按字母顺序对节点进行排序
- D3.js:展开树直到节点n
- d3力中的阵列和节点映射
- 如何在d3.js图库中基于nodes id连接边和节点
- D3.js-单击节点后无法设置节点标签
- D3:从不同的图表中选择特定的节点
- 从 d3.js 中的树中选择节点的子节点
- D3 上下文菜单,更改所选节点颜色
- d3.js - 强制布局和节点位置
- 将标签放在 d3.js 中节点的中心
- 正在节点d3.js之间创建链接,当前返回Uncaught TypeError:无法读取属性'weight'
- 如何仅选择具有特定 CSS 类的节点?D3/JS.
- 如何查看使用 d.selected 选择了哪些节点?D3/JS.
- 在连接到节点 d3.js 之前穿过另一点的线
- 如何一次移动所有选定的节点?D3/JS.
- 树映射高亮显示子节点D3