Mike Bostock在他的d3 Sankey Diagram page上说:“算法可以在未来得到改进,比如说最小化链路穿越”。D3 Sankey尽量减少链路穿越
我想投入一些时间并做到这一点,但我不确定要开始。有没有人有任何建议或想法如何实现这一目标?
我的直觉是,应用于节点以减少链路距离的迭代松弛也可用于重新定位相同的节点以最小化链路交叉。
即使在每个x位置只有一个节点的情况下,我仍然需要垂直“分散”节点,这样链路交叉就会大大减少(它不需要是学术型的,一个实际的,比现在更好的结果就足够了)
Here是一个JS小提琴作为一个起点 - 节点定位在一个次优方式,使边缘/链接交叉最开始:
function getData() {
return {
"nodes": [{
"node": 0,
"name": "Name0"
}, {
"node": 1,
"name": "Name1"
}, {
"node": 2,
"name": "Action2"
}, {
"node": 3,
"name": "Name3"
}, {
"node": 4,
"name": "Name4"
}, {
"node": 5,
"name": "Action5"
}, {
"node": 6,
"name": "Action6"
}, {
"node": 7,
"name": "Action7"
}, {
"node": 8,
"name": "Action8"
}],
"links": [{
"source": 0,
"target": 6,
"value": 25,
"id": "name0"
}, {
"source": 1,
"target": 2,
"value": 25,
"id": "Name1"
}, {
"source": 2,
"target": 5,
"value": 25,
"id": "Name1"
}, {
"source": 3,
"target": 6,
"value": 25,
"id": "Name3"
}, {
"source": 6,
"target": 7,
"value": 25,
"id": "name0"
}, {
"source": 4,
"target": 7,
"value": 25,
"id": "Name4"
}, {
"source": 5,
"target": 7,
"value": 25,
"id": "Name1"
}, {
"source": 6,
"target": 7,
"value": 25,
"id": "Name3",
}, {
"source": 7,
"target": 8,
"value": 25,
"id": "Name3"
}]
};
}
我相信这是一个双边图的边交叉最小化的变体。这个问题可能会提供一些想法:http://stackoverflow.com/questions/20107645/minimizing-number-of-crossings-in-a-bipartite-graph。相邻图层中的节点组成一个二部图,您可以解决层与层之间的边缘交叉问题。在Sankey中增加了一些复杂性,因为连接可以“传递”一层(如Mike Bostock的例子)。 –