在Web应用程序中绘制有向无环图 - 只有奇怪的方法可用吗?

时间:2015-08-27 14:56:23

标签: javascript graph graphviz cytoscape.js dagre

我们目前正在构建 Web应用程序(AngularJS),需要绘制有向无环图(最多1000个节点,最多10000个边)动态创建数据。

一年多以来,我一直在寻找一个库/工具,它正在计算所需的布局并绘制图形,可以设置样式,缩放和平移,交互式(例如,突出显示鼠标上的子项) )。

Graphviz是产生最佳效果的工具,但它并没有真正准备好在网络服务器上使用(特别是因为我无法保证操作系统并且不想这样做)。

我尝试了dagre及其d3 rendering - 我非常喜欢它,但它有两个主要缺点:1)它并不真正支持排名和群集 - 这使得输出相当混乱,2)随着图表越来越大,其性能变得越来越不可接受。

真正令人信服的下一件事是cytoscape.js,因为输出看起来非常好,并且绘制更大的图形(并允许一些性能调整)相当快。但是它的标准布局(例如cose或breadthfirst)并不能产生我们需要的输出。

从我目前的观点来看,有两次机会:

1)使用 dagre.js 创建布局,并使用 cytoscape.js 绘制结果(布局:'预设',使用计算出的x和y来自dagre布局的节点)。但是那种化合物' / cluster不支持这种方式。

2)使用 [viz.js] https://github.com/mdaines/viz.js)(Graphviz的emscripted Javascript版本,在绘制图表时表现不佳)将结果计算为输出格式普通并再次使用此结果用 cytoscape.js 绘制它。

现在我的问题:

1)你有另外的想法如何实现它?

2)如果我的想法是正确的,你能否给我一些如何理想地链接链条的提示?

(AngularJS - > REST后端 - > JSON到前端 - >重构JSON用于dagre或viz - >计算布局 - >输入结果到cytoscape - >在浏览器中渲染?!?)并且在那里有机会在我的node.js前端服务器而不是客户端本身进行布局计算(再次由于性能)?

任何提示和想法都会受到重视。

2 个答案:

答案 0 :(得分:0)

Cytoscape.js可以使用dagre布局。您可以在cytoscape文档中查看here以获取更多信息,但您只需将节点和边添加到图形中,然后运行dagre布局。这样您就不必根据单独的dagre.js中节点的位置手动定位所有节点。

答案 1 :(得分:0)

听起来你对Dagre的复杂布局感到不满意。这是有道理的,因为Dagre的作者没有为它实施复合支持。 Dagre与Cytoscape.js是分开的,但可以被它使用。你会注意到Dagre的作者已经声明他将不再使用他自己的新功能更新库。因此,您的选择是:

(1)使用另一个实际为复合节点设计的Cytoscape.js布局,如CoSE或Cola。

(2)为符合您需求的Cytoscape.js编写自己的布局:http://js.cytoscape.org/#extensions/layouts

(3)调整Dagre以识别复合节点并向作者发出拉取请求:https://github.com/cpettitt/dagre然后可以更新Dagre的Cytoscape.js布局以使用您添加的新Dagre API。

目前,复合图形布局是一个开放的研究领域 - 因此您很难在任何库中找到支持它们的许多布局。 Cytoscape.js有一些复合支持布局,如果你想要不同的行为,你可以自由分叉。另请注意,2.5分支的CoSE2具有改进的算法。