我们目前正在构建 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前端服务器而不是客户端本身进行布局计算(再次由于性能)?
任何提示和想法都会受到重视。
答案 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具有改进的算法。