如何让 Cytoscape 将单独的节点组放置得更近并避免自我边缘重叠

How to get Cytoscape to place separate node groups closer and avoid overlapping self edges

我之前使用过 Springy 来生成力导向图。它似乎有一个非常智能的算法来避免重叠节点或链接,并且它也有节制地使用可用的space:

http://getspringy.com/demo.html

不幸的是,Springy 使用 jQuery 并且不适合我当前的项目,正在寻找一个好的替代品。目前我正在试验 Cytoscape。我尝试了几种布局,Cose-Bilkent 似乎是迄今为止最好的。但是,我也有一些问题:

在典型情况下,我会有 4-16 个节点和边。我正在寻找一种方式,以美观、紧凑的形式展示它们,并尽可能减少重叠边缘。

设置:

    randomize: true,
    nodeRepulsion: 1000,
    idealEdgeLength: 30,
    gravity: 0.1

我还测试了以下布局:

Euler 似乎根本不起作用,它只是挂了我的浏览器。

其他的我不知道,但是cose-bilkent和fcose在计算时都没有考虑自环边,layout后绘制自环边与cytoscape.js.

这两种算法都没有额外努力减少边交叉,但 fcose 通常在提供平面图的平面嵌入方面做得更好。

减少断开组件之间距离的一种方法是在两种算法中增加 gravity/decrease gravityRange。此外,在默认设置下,fcose 预计会生成比 cose-bilkent 更紧凑的布局。

我尝试 packComponents() 从 cytoscape-layout-utilities 上的一千个节点集群图,但它要么进入无限循环,要么工作速度超慢(我在 3 小时后终止了进程)。最终得到了我自己的打包算法,它在 1 毫秒内完成了工作(golang,而不是 js)。

Euler 不错,而且速度相对较快,但有点小问题。当 randomize 选项设置为 false 时挂起。

Cise 生成出色的布局,但在我的 i7 9700 上这个过程需要半个小时。

将 Euler 设置为 randomize 选项为真将解决浏览器无限加载问题。