如何防止Graphviz中的边缘重叠

81

我使用graphviz创建了一个图表,但问题是边缘彼此重叠(每行有5-7个节点),因此很难确定每个节点连接的节点。

我该如何使边缘不重叠?让它们相交也可以。


3
阅读文档 https://graphviz.gitlab.io/_pages/pdf/neatoguide.pdf 的第4节,它说无法防止边缘重叠,并表示这是"未来工作的方向"。我有一个非常大的图形,所以 overlap=scale 会产生非常小的印刷效果,而 overlap=false 则非常密集!我希望有一种方法可以同时使用少量的 Voronoi 和 scale,而不是只能选其一。 - John Henckel
4
经过一些尝试,我使用dot -Granksep=2 -Gnodesep=1 -Grankdir=LR -Gsplines=ortho -Nshape=box 获得了不错的效果。您可以增加方框的大小和间距,并最终实现零重叠。不幸的是,neato和twopi不允许使用nodesep,所以您只能使用dot。 - John Henckel
3个回答

57

我假设您有一个用dot布局的有向图。

我认为没有一个神奇的开关可以防止重叠边缘。Graphviz会尝试默认实现这一点。

以下是一些根据图形可能会有所帮助的建议:

  • 边缘聚合器(concentrate=true):将具有共同端点的多个边缘合并为单个边缘,并使部分平行边缘共享它们路径的一部分。
  • 端口:边缘可以在特定端口(n,ne,e,se,s,sw,w,nw,w,c,_)上具有它们的起点和终点。根据边缘端口,边缘会改变其形式(样条曲线)。
  • 不可见节点:引入不可见节点来路由边缘可能会产生期望的效果。

6
如何设置端口属性? - dnivog
5
仅需在节点ID后添加冒号和端口即可(请参见https://graphviz.gitlab.io/_pages/doc/info/lang.html),例如`node1:ne -> node2:nw`。 - marapet

29

另一种方法是给图形添加一个overlap属性。允许的属性是scale(这将极大地增加输出的大小)或false(这不会增加太多的大小,但可能会导致边重叠在节点上)。

overlap = scale;

如果你正在使用 overlap=false,你可以通过添加属性 splines=true 来消除节点之间的边缘重叠:

overlap = false;
splines = true;

对于大型图形,这将明显减慢生成时间。


5
我该在图表的哪里添加这些属性?我将它们插入图表的主体部分,但没有任何变化。 - Steven Lu
8
添加“graph [overlap=false, splines=true];”并不能解决我的边重叠问题。 - Steven Lu
11
DOT引擎不支持"overlap"。 - vertti
20
"overlap" 只涉及节点重叠,与边缘重叠无关。 - Ingmar Hupp
1
只是要注意这些可以在控制台上指定,像这样:neato -Goverlap=false -Gsplines=true -Tpdf inputFile > outputFile - Anssssss
显示剩余3条评论

14

即使是相当微不足道的图形,我也会使用graphviz (neato, fdp)来生成重叠部分。例如:

即使对于相当平凡的图表,我也使用graphvizneatofdp)来生成不重叠的图像。例如:

graph G {
0;
1;
2;
3;
0--1 ;
1--2 ;
2--3 ;
3--0 ;
}

在我的代码版本2.38.0中会产生一些交叉问题。

根据文档的建议,这种情况下可以尝试使用不同的随机种子。对于更复杂的图表,交叉是不可避免的,我不确定引擎为避免交叉付出了多少努力。

例如,对我来说这个方法有效:

neato -Gstart=5 file.dot -Tps -o file.ps

1
现在(2018-05-31)链接似乎已经失效了。这个链接可以使用:https://graphviz.gitlab.io/faq/#FaqNeatoEdgeCrossings - Ronie
@alfC 请跟随链接,我会解释命令行并提供一个例子。我正在使用neato和dot,在这两种情况下都有一些边缘被轻易地穿过。 - skan
@skan,我找了但没找到命令行,你能在这里重复一下吗? - alfC
我正在使用R中的Diagrammer。我告诉它使用内部Graphviz生成图形。我首先定义节点和边,然后定义一些属性,例如neato布局,并将所有内容存储在“graph”上。最后,我使用命令render_graph(graph)。 - skan
@skan,如果你非常幸运的话,也许可以劫持输出参数,将选项悄悄传递给命令行render_graph(graph, "-Gstart=5 file.eps") - alfC
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接