【问题标题】:Cytoscape.js layout edge lengthCytoscape.js 布局边长
【发布时间】:2016-11-23 11:27:32
【问题描述】:

您好,我正在尝试为一个学校项目构建一个网络爬虫可视化工具。我决定使用 Cytoscape.js,它真的很好用。我遇到的问题是某些布局(圆形、宽度优先、同心)的边长似乎太大,而且图表看起来很奇怪。

当我第一次启动应用程序时,我手动制作并加载了一个包含 100 个节点的图(它是一棵树),并且在圆形布局中看起来不错:

但是,在我执行网络爬网之后,新图(这个有 44 个节点)不适合圆形视图:

有没有办法让它工作,使边不那么长,节点看起来更大?

编辑:

这是我用来更改布局的代码:

changeLayout = function(layoutName, title,  root){
                var numOfNodes = cy.filter('node').length;
                //extent changes when I repeatedly change the layout to circle, (don't understand this behavior)
                var extent = cy.extent();
                var rect = document.getElementById("cy-container").getBoundingClientRect();

                var x1 = rect.left;
                var x2 = rect.right;
                var y1 = rect.top;
                var y2 = rect.bottom;

                var height = (y2 - y1);
                var width = (x2 - x1);

                var fact = (height < width) ? (height/numOfNodes) : (width/numOfNodes);
                fact *= 5;
                var myRadius = height < width ? (height-fact) : (width-fact);

                switch(layoutName){
                        case 'circle':
                                myLayout = cy.makeLayout(
                                {       name: layoutName,
                                        radius: myRadius,
                                        boundingBox: {x1: x1, x2: x2, y1: y1, y2: y2},
                                        fit: true,
                                        avoidOverlap: false
                                });
                                break;
                        case 'concentric':
                                myLayout = cy.makeLayout(
                                {       name: layoutName,
                                        height: height,
                                        width: width,
                                        fit: false,
                                        avoidOverlap: true
                                });
                                break;
                        case 'breadthfirst':
                                myLayout = cy.makeLayout(
                                {       name: layoutName,
                                        boundingBox: {x1: x1, x2: x2, y1: y1, y2: y2},
                                        fit: true,
                                        roots: root,
                                        avoidOverlap: false
                                });
                                break;
                        default :
                                myLayout = cy.makeLayout(
                                {
                                        name: layoutName
                                });
                }

                myLayout.run();
                $('#graphTitle').text(title + " Layout");
        };

【问题讨论】:

  • 这可能是各种各样的事情。很可能它与布局功能相关联。您能否发布您所有的 cytoscape 代码,以便我们更好地理解问题?

标签: cytoscape.js


【解决方案1】:

边的长度是节点位置的函数。布局设置位置,因此您必须设置布局选项以使节点更靠近。

对于力导向(物理模拟)布局,您可以调整力。在其他布局中,您可以调整间距值或强制使用边界框来影响节点的分布程度。

【讨论】:

  • 谢谢我注意到一些我不明白的事情,我尝试使用范围设置边界框,但是当我反复设置圆形或同心布局时,我注意到 cy.extent() 保持变化并导致节点看起来越来越小。所以我在保存图表的容器上使用了 getBoundingClientRect() 。这似乎适用于圆形和广度优先但同心的外观。对于同心,如果我关闭避免重叠,那么节点似乎真的想堆叠在彼此之上。
  • 如果您不使用自动重叠避免,那么您必须将边界框设置得足够大,以使节点不会重叠。我们已经计划了一些功能以在未来的版本中使这个用例更容易,但它们在优先级列表中的位置更靠后一些。 This one 足以满足您的用例。如果您想为其进行 PR,将不胜感激,该功能将在下一个功能版本中发布。
  • 当然我很乐意做一个公关,我该如何提出请求?
猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多