我正在尝试使用d3js制作Sankey图。我正在使用csv数据源,并基于此块使用代码:http://bl.ocks.org/d3noob/c9b90689c1438f57d649
我的数据集非常大,但我认为我应该处于打破SVG渲染器的阈值之下。不过我不确定。使用1082行“ SankeyDataSampleFunctional.csv”运行时,我的代码可以正常工作。看起来是这样的:
我对原始代码库进行了一些细微修改,以使我的图在某些层上具有大量的节点,而在另一些层则没有。这是我尝试在sankey.js中容纳它:
function initializeNodeDepth() {
var ky = d3.min(nodesByBreadth, function(nodes) {
if (nodes.length > 200){
return (size[1] - (nodes.length - 1) * 1) / d3.sum(nodes, value);
}
else if (nodes.length > 1000) {
console.log((size[1] - (nodes.length - 1) * 1) / d3.sum(nodes, value))
return (size[1] - (nodes.length - 1) * 1) / d3.sum(nodes, value);
}
return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes,
value);
});
我这样做是为了缩小大量节点上节点之间的空间。
但是,当我尝试在最后一层添加2102个以上的节点时,会遇到各种各样的问题。当我将“ SankeyDataSample1.csv”插入有问题的相同代码中时,结果如下所示:
我检查了控制台,并说我正试图画一堆负高度的东西。我的第一个方法是删除2102个额外节点中的2101个,以查看是否可以在下一层上正确渲染一个节点。当然不是:
我尝试向该分支添加一些其他深度,并且它继续以错误的方向渲染分支:
最终,我检查了这篇关于某人在d3 sankey中使用大型数据集的文章:Large data set breaks d3 sankey diagram
我尝试强迫我的身高不为零的“快速解决方案”,在这篇文章中看到:
.attr("height", function(d) { return d.dy < 0 ? 0 : d.y; })
但是,这对我没有多大作用。我还尝试将d.dy的负值乘以-1,希望将它们取反,这就是我得到的一切:
这是我的代码:http://plnkr.co/edit/g2rE0z?p=info
最后2k个节点是否使我达到了SVG的极限?还是我只是要解决这个问题?任何援助将不胜感激。
最佳答案
您是否尝试过扩大画布尺寸?通常,就我而言,如果节点没有剩余空间,它就会像这样渲染。