在web应用程序中绘制有向无环图-只有奇怪的方法可用
Drawing directed acyclic graphs in a web application - only strange approach available?
我们目前正在构建一个web应用程序(AngularJS),它需要基于动态创建的数据绘制有向无环图(最多1000个节点,最多10000条边)。
一年多以来,我一直在寻找一个库/工具,它正在计算所需的布局和绘制图形,可以进行样式设计,缩放和可平移,交互式(例如在鼠标上方突出显示儿童)。
Graphviz是产生最佳结果的工具,但它还没有真正准备好在web服务器上使用(特别是因为我不能保证操作系统,也不想)。
我尝试了dagre,它是d3渲染-我非常喜欢它,但它有两个主要缺点:1)它不真正支持排名和聚类-这使得输出相当混乱;2)随着图越来越大,它的性能变得不可接受。
下一个真正令人信服的东西是cytoscape.js,因为输出看起来非常好,它在绘制更大的图形时相当快(并允许一些性能调整)。但是它的标准布局(例如:close或breadthfirst)并不能产生我们所需要的输出。
从我目前的观点来看,我们有两个机会:
1)使用dagre.js创建布局,并使用cytoscape.js绘制结果(布局:'preset',使用dagre布局中计算的节点x和y)。但是这种方式不支持"复合词"/簇。
2)使用[viz.js](https://github.com/mdaines/viz.js) (Graphviz的emscript Javascript版本,在绘制图形时再次表现不佳)将结果计算为输出格式,并再次使用此结果使用cytoscape.js绘制。
现在我的问题是:
你有其他的想法如何实现它吗?2)如果我的想法是正确的,你能给我一些提示,如何理想地连接链条吗?
(AngularJS -> REST后端-> JSON到前端->重组JSON为dagre或viz ->计算布局->输入结果到cytoscape ->在浏览器中渲染?!?),是否有机会在我的node.js前端服务器上进行布局计算,而不是客户端本身(再次由于性能)?
听起来您对Dagre的复合布局不满意。这是有道理的,因为Dagre的作者并没有实现对它的复合支持。Dagre是独立于Cytoscape.js的,但可以被它使用。您会注意到Dagre的作者已经声明他将不再使用自己的新特性更新库。因此,您的选项是:
(1)使用另一个实际上为复合节点设计的Cytoscape.js布局,如CoSE或Cola。
(2)为Cytoscape.js编写自己的布局,以满足您的需求:http://js.cytoscape.org/#extensions/layouts
(3)适应Dagre以识别复合节点并向作者发出pull请求:https://github.com/cpettitt/dagre然后可以更新Dagre的Cytoscape.js布局,以使用您添加的新Dagre api。
目前,复合图布局是一个开放的研究领域——所以你将很难在任何图书馆中找到许多支持它们的布局。js有一些复合支持布局,如果你想要不同的行为,你可以自由地fork它们。还需要注意的是,2.5分支具有改进算法的CoSE2。
Cytoscape.js可以使用dagre布局。您可以查看这里的cytoscape文档以获取更多信息,但您可以将节点和边添加到图形中,然后运行dagre布局。这样,您就不必根据单独的dagree .js中的节点位置手动定位所有节点。
- 有没有一种方法可以通过只引用JavaScript来执行代码
- sails.js beforeCreate方法只接收required设置为true的模型属性
- 只将JSON中的属性加载到现有的javascript对象中,而不破坏方法
- 有没有一种方法可以让我得到window.onresize只刷新页面的宽度大小
- 有没有更好的方法将音频与视频同步(只需将其放在视频中即可)
- 如何测试只在闭包范围中可见的javascript方法
- setInterval 只在对象方法上运行一次
- Javascript 计时器只调用一次 Code 隐藏方法
- 使用 jQuery 只选择第一级后代 - 有没有更好的方法
- 优化的方法;标题“;只发送一次POST请求即可访问网站
- 有没有一种方法可以在jQuery中只选择匹配的元素而不选择它们的子元素
- charAt(i)方法比只使用[i]更快吗
- 是否可以使find()和findOne()方法只返回模式字段
- 用HTML创建一个下拉框的简单方法,只需包含0到x
- 在 JavaScript 中只执行方法的一部分
- Android WebView 应该覆盖 UrlLoad,我应该调用超级方法还是只返回 false
- 只需要运行一次 location.reload 方法
- 在Angularjs中只运行一次方法
- 有没有一种简单的方法可以只在元素内容发生更改时重新加载它
- 有没有一种方法可以只允许在一组按钮中选择一个按钮