Javascript D3关键链路扩展问题

Javascript D3关键链路扩展问题,javascript,d3.js,sankey-diagram,Javascript,D3.js,Sankey Diagram,我需要画一个sankey图表来显示关联。我已经使用d3.scaleLinear()缩放了节点,以赋予小节点以意义,但链接没有按照节点进行缩放。我也尝试过链接缩放,但它不起作用 //node scale var maxVal_node = d3.max(nodes.map(m => m.value)); var minVal_node = d3.min(nodes.map(m => m.value)); var nodeScale = d3.scaleLinear() .dom

我需要画一个sankey图表来显示关联。我已经使用d3.scaleLinear()缩放了节点,以赋予小节点以意义,但链接没有按照节点进行缩放。我也尝试过链接缩放,但它不起作用

//node scale
var maxVal_node = d3.max(nodes.map(m => m.value));
var minVal_node = d3.min(nodes.map(m => m.value));
var nodeScale = d3.scaleLinear()
    .domain([minVal_node, maxVal_node])
    .range([10, 120]);
d3.sankey=function(){
var sankey={},
nodeWidth=24,
nodePadding=8,
大小=[1,1],
节点=[],
链接=[];
sankey.nodeWidth=函数{
如果(!arguments.length)返回nodeWidth;
节点宽度=+;
返回sankey;
};
sankey.nodePadding=函数(\ux){
如果(!arguments.length)返回nodePadding;
nodePadding=+\u3;
返回sankey;
};
sankey.nodes=函数(\ux){
如果(!arguments.length)返回节点;
节点=33;;
返回sankey;
};
sankey.links=函数(\ux){
如果(!arguments.length)返回链接;
链接=u;
返回sankey;
};
sankey.size=函数(\ux){
如果(!arguments.length)返回大小;
大小=u2;;
返回sankey;
};
sankey.layout=函数(迭代次数){
computeNodeLinks();
货币贬值();
computeNodeBreadths();
计算深度(迭代);
计算链接深度();
返回sankey;
};
sankey.relayat=函数(){
计算链接深度();
返回sankey;
};
sankey.link=函数(){
var曲率=.5;
功能链接(d){
var x0=d.source.x+d.source.dx,
x1=d.target.x,
席=D3.插值数(x0,x1),
x2=xi(曲率),
x3=xi(1-曲率),
y0=d.source.y+d.sy+d.dy/2,
y1=d.target.y+d.ty+d.dy/2;
返回“M”+x0+“,“+y0”+
“C”+x2+,“+y0+
“+x3+”,“+y1”+
“+x1+”,“+y1;
}
link.curvature=函数{
如果(!arguments.length)返回曲率;
曲率=+;
返回链接;
};
返回链接;
};
//填充每个节点的SourceLink和TargetLink。
//此外,如果源和目标不是对象,则假定它们是索引。
函数computeNodeLinks(){
forEach(函数(节点){
node.sourceLinks=[];
node.targetLink=[];
});
links.forEach(函数(link){
var source=link.source,
target=link.target;
if(typeof source==“number”)source=link.source=nodes[link.source];
if(typeof target==“number”)target=link.target=nodes[link.target];
source.sourceLinks.push(link);
target.targetLinks.push(链接);
});
}
//通过对相关链接求和,计算每个节点的值(大小)。
函数computeNodeValues(){
forEach(函数(节点){
node.value=Math.max(
d3.总和(node.sourceLinks,值),
d3.总和(node.targetLink,值)
);
});
}
//迭代地为每个节点分配宽度(x位置)。
//节点被分配到传入邻居的最大宽度加上1;
//没有传入链接的节点的宽度为零,而
//没有传出链接的节点被指定最大宽度。
函数computeNodeReadths(){
var remainingNodes=节点,
下一个节点,
x=0;
while(remainingNodes.length){
nextNodes=[];
remainingNodes.forEach(函数(节点){
节点x=x;
node.dx=节点宽度;
node.sourceLinks.forEach(函数(链接){
if(nextNodes.indexOf(link.target)<0){
nextNodes.push(link.target);
}
});
});
剩余节点=下一个节点;
++x;
}
//
向右移动(x);
scaleNodeBreadths((大小[0]-节点宽度)/(x-1));
}
函数moveSourcesRight(){
forEach(函数(节点){
如果(!node.targetLinks.length){
node.x=d3.min(node.sourceLinks,函数(d){
返回d.target.x;
}) - 1;
}
});
}
函数moveSinksRight(x){
forEach(函数(节点){
如果(!node.sourceLinks.length){
节点x=x-1;
}
});
}
函数scaleNodeBreadths(kx){
forEach(函数(节点){
node.x*=kx;
});
}
函数计算深度(迭代次数){
var nodesbywidth=d3.nest()
.键(功能(d){
返回d.x;
})
.排序键(d3.升序)
.条目(节点)
.地图(功能(d){
返回d值;
});
//
初始化enodedepth();
解析冲突();
对于(var alpha=1;迭代次数>0;--迭代次数){
从右到左的松弛(α=0.99);
解析冲突();
relaxleftoright(alpha);
解析冲突();
}
函数initializeNodeDepth(){
var ky=d3.min(节点宽度、函数(节点)){
返回(大小[1]-(nodes.length-1)*节点添加)/d3.sum(节点,值);
});
forEach(函数(节点){
forEach(函数(node,i){
节点y=i;
node.dy=node.value*ky;
});
});
links.forEach(函数(link){
link.dy=link.value*ky;
});
}
功能relaxLeftToRight(alpha){
forEach(函数(节点,宽度){
forEach(函数(节点){
if(node.targetLinks.length){
变量y=d3.sum(node.targetLinks,weightedSource)/d3.sum(node.targetLinks,value);
//node.y+=(y-中心(节点))*alpha;
}
});
});
函数权重源(链接){
返回中心(link.source)*link.value;
}
}
功能松弛右至左(alpha){
nodesbywidth.slice().reverse().forEach(函数(节点){
forEach(函数(节点){
if(node.sourceLinks.length){
变量y=d3.sum(node.sourceLinks,weightedTarget)/d3.sum(node.sourceLinks,value);
//node.y+=(y-中心(节点))*alpha;
}
});
});
功能权重目标(链接){
返回中心(link.target)*link.value;
}
}
函数解析冲突