javascript – d3 sankey图表 – 沿x轴手动定位节点

我使用 d3 sankey实现的问题是,没有办法指定节点在x轴上的位置.我一直在通过源代码,并没有真正的“干净”的方式来以合理的比例来指定x值(即图1-5是5个节点宽).我正在创造一些可以像课程计划者一样使用教育的东西,所以x值将与学期相符.假设我有一门课程,直到我大二学年才能上课,这将是一个三分之一(1/2是新生,3/4大二等).问题是,如果事先没有连接到这个课程,它总是在x的1,所以我想把它推到正确的两个空格.

我注意到,实际的sankey图表中的x值并不能反映出它的多少个节点,所以这很难做到.

我也碰到了this question,我意识到,认情况下,图表不会让我放置一个节点.我没有任何问题调整sankey.js的例子来完成这个,但是我现在坚持要怎么做.

解决方法

这个有可能.看这个 JSFiddle.

可以修改sankey.js中的computeNodeBreadths函数,以查找已分配给节点(node.xPos)的显式x位置:

function computeNodeBreadths() {
    var remainingNodes = nodes,nextNodes,x = 0;

    while (remainingNodes.length) {
      nextNodes = [];
      remainingNodes.forEach(function(node) {

        if (node.xPos)
            node.x = node.xPos;
        else
            node.x = x;

        node.dx = nodeWidth;
        node.sourceLinks.forEach(function(link) {
          nextNodes.push(link.target);
        });
      });
      remainingNodes = nextNodes;
      ++x;
    }

    //
    moveSinksRight(x);
    scaleNodeBreadths((width - nodeWidth) / (x - 1));
  }

那么你需要做的就是在所需的节点上指定xPos.在上面的例子中,我已经在node2上设置了xPos = 1.请参阅JSfiddle示例中的getData()

... },{
        "node": 2,"name": "node2","xPos": 1
    },{ ...

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...