我正在使用复合图。我知道父节点的位置(例如地理坐标),我想布置子节点,以便最小化边的交集。孩子们的最终位置并不重要,只要他们彼此接近。
使用Cytoscape.js的CoSE Bilkent算法为我提供了正确的布局,但我想设置父节点的位置并将它们锁定到位。
我做了什么:
locked
没有运气我得到的最好的是this。
到目前为止,群组的相对位置是正确的,但如果我添加新群组g5
,我会得到this。
期望的结果将是这样的:
如果需要,我可以使用另一个库。
答案 0 :(得分:2)
(1)父母的位置和维度由其子女的位置和维度暗示。
(2)您可以在图表的子集上运行布局(例如仅限儿童):http://js.cytoscape.org/#collection/layout
(3)避免边缘在高效的布局中相互重叠是一个积极的,未解决的研究问题。另外,有些图表不是平面的。
尝试使用(2)在每个父级子孙的子图上运行布局:
var topLvlParents = cy.nodes().orphans(':parent');
topLvlParents.forEach(function( parent ){
var descendants = parent.descendants();
var edges = nodes.edgesWith( nodes );
descendants.union( edges ).layout( someLayoutOptions );
});
您可以使用cose-bilkent
作为子图布局,并将位置调整到layoutstop
上所需的边界框({{1}}本身支持的boundingBox
会更容易)。或者您可以使用cose-bilkent
- 这不像cose
那样复杂,但允许今天直接放置cose-bilkent
。
如果您的复合父子层次结构只有一个级别,那么您也可以尝试使用boundingBox
的子项上的任何非复合布局。
我的理解是CoSE Bilkent是复合节点布局最先进的算法。它来自一所专门研究图论,布局等的大学实验室。