为什么这个 d3 图表呈现十字,然后在移动节点时摆脱它们?

Why does this d3 chart render with crosses, then get rid of them upon moving a node?

我构建了一个改编自 this example 的 d3 sankey 图,以显示我的程序中课程的先决条件流程。但是,我没有让库自动定位节点,而是手动设置了它们的 xy 坐标,以在调用 update();[=19 之前尽量减少与这段代码的交叉=]

if (!AUTO_POSITION) {
    exampleNodes.forEach((r, i) => {
        r.x = r.xPos;
        r.y = r.yPos;
    });
}

图表最初呈现如下(注意线在 MATH 100、MATH 101、PHYS 101、PHYS 102、ELEC 211、ELEC 311 等附近交叉):

但是,当您单击并拖动任何一个节点时,图表会调整为这样(注意大多数十字消失):

程序为什么要这样做?我怎样才能让图表在加载时不带叉号?

我试过在加载时 hackily 触发节点被单击和拖动的事件,但是有一点延迟,需要移动鼠标才能工作。另外,我只会将其用作最后的解决方法。

var evt = document.createEvent("MouseEvents");
evt.initEvent("mouseup", true, true);
evt.initEvent("mousedown", true, true);
document.querySelector("g.node").dispatchEvent(evt);

我的示例的完整代码在 JSFiddle 中。谢谢。

如果我是对的,那是因为数组中的数据顺序与它们的位置顺序不匹配。数组顺序似乎决定了依赖项的显示顺序,除非您重新定位任何元素,这会导致重新渲染。

我已经尝试重新排序数据数组的一些元素,以遵循图表上的位置,并且它们的大小和它们之间的依赖关系链接自动呈现良好。

我还注意到,有些元素虽然列在数组中,但没有显示在图表中,因为它们没有添加任何依赖项。

一个解决方案是制作这样的超时函数:

  setTimeout(function() {
    //does the relayout
    biHiSankey.relayout();
    //update all the nodes with new height
    svg.selectAll(".node").selectAll("rect").attr("height", 
     function (d) { 
        return d.height; 
    });
    //update all the path
    link.attr("d", path);
  }, TRANSITION_DURATION +450);

update 函数内。

这将在转换完成后触发。

工作代码here