74

我有一个我在graphviz 中创建的图,但问题是边相互重叠(我每行有5-7 个节点),所以很难分辨每个节点哪些是它连接的节点。

如何使边缘不相互重叠?让它们相互交叉就可以了。

4

3 回答 3

50

我假设你有一个用点布局的有向图。

我不认为有一个神奇的开关可以防止重叠的边缘。Graphviz 尝试开箱即用地做到这一点。

一些可能有帮助的建议,具体取决于图表:

  • 边缘集中器(concentrate=true):将具有公共端点的多个边缘合并为单个边缘,并且部分平行的边缘共享其路径的一部分。
  • 端口:边缘可以在特定端口(n,ne,e,se,s,sw,w,nw,w,c,_)上具有它们的起点和终点。根据边缘端口,边缘会改变其形状(样条)。
  • 不可见节点:在某些情况下,将不可见节点引入路由边缘可能会产生预期的效果。
于 2011-01-12T16:53:04.223 回答
24

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

overlap = scale;

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

overlap = false;
splines = true;

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

于 2011-10-31T13:50:30.623 回答
13

即使对于非常微不足道的图表,我也看到graphviz( neato, fdp) 会产生重叠。例如:

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
于 2015-01-06T18:30:51.167 回答