使用CoSE Bilkent布局强制某些节点的位置

时间:2016-02-24 16:10:34

标签: javascript cytoscape.js

我正在使用复合图。我知道父节点的位置(例如地理坐标),我想布置子节点,以便最小化边的交集。孩子们的最终位置并不重要,只要他们彼此接近。

使用Cytoscape.js的CoSE Bilkent算法为我提供了正确的布局,但我想设置父节点的位置并将它们锁定到位。

我做了什么:

  1. this example开始,但节点较少;
  2. 设置每个组的位置:
    1. 只有父母;
    2. 父母及其子女的相同坐标;
  3. 调整了布局的一些选项;
  4. 尝试了属性locked没有运气
  5. 我得到的最好的是this

    到目前为止,群组的相对位置是正确的,但如果我添加新群组g5,我会得到this

    期望的结果将是这样的:

    如果需要,我可以使用另一个库。

1 个答案:

答案 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是复合节点布局最先进的算法。它来自一所专门研究图论,布局等的大学实验室。