D3 sankey图 - 强制节点位置

Posted

技术标签:

【中文标题】D3 sankey图 - 强制节点位置【英文标题】:D3 sankey diagram - enforce node position 【发布时间】:2015-02-17 15:59:12 【问题描述】:

使用 D3 Sankey 插件,我正在使用新值更新 Sankey 图(更改数据、为节点和链接传递新值——保持所有这些值一致)。是否有像 d3.treemap 的 sticky 这样的功能来维护页面上的节点和链接顺序?如果没有,有没有办法构建它?

var sankey = d3.sankey()
    .nodeWidth(15)
    .nodePadding(10)
    .size([width, height]);
    .sticky(true)

我在这里遵循模式:http://bost.ocks.org/mike/sankey/

【问题讨论】:

【参考方案1】:

不,没有。如果您想深入了解布局,请查看此处:

function computeNodeDepths(iterations) 
 var nodesByBreadth = d3.nest()
    .key(function(d)  return d.x; )
    .sortKeys(d3.ascending)
    .entries(nodes)
    .map(function(d)  return d.values; );

initializeNodeDepth();
...

注意 sortKeys 指向 d3.ascending。您希望它指向某种硬连线值,您需要在第一次迭代或数据准备中计算该值。当碰撞检测功能运行时它仍然会被调整,所以你可能会看到你的节点被推到了位置,但这会给你最好的机会来保持一些控制。

【讨论】:

谢谢——你知道 sortKeys 函数的结构吗?我猜 function(a,b) return myOrder.indexOf(a) - myOrder.indexOf(b) 这是 d3.nest() 的一部分,它需要一个排序函数,就像你发送到 Array.sort() 一样,这就像你描述的函数,但我不认为特别的一个会工作。我建议查看 Array.sort()。

以上是关于D3 sankey图 - 强制节点位置的主要内容,如果未能解决你的问题,请参考以下文章

根据数据中的附加列更改 d3 Sankey 图中的节点颜色

修复 D3 强制定向布局中的节点位置

当链接太多时,d3 sankey插件没有绘制?

d3.js v4 sankey图 - 粒子和拖动不起作用

d3 以可预测的顺序强制布局节点

d3js 在地图上强制布局