如何在graphviz中控制节点放置(即避免边缘交叉)

jnn*_*nns 43 dot graphviz edge-detection

我正在使用graphviz(点)生成您可以在下面看到的图形.左下角的节点(红色椭圆)因其边缘穿过相邻节点的几个边缘而引起烦恼.有没有办法将节点放置到某个区域?

谢谢你的想法

边缘穿过其他几个边缘的图形

smo*_*ris 48

您可以创建一个不可见的约束,以使红色节点出现在所有其他节点的左侧.

redNode -> leftmostNode [style=invis];
Run Code Online (Sandbox Code Playgroud)

之前:

之前

后:

后

  • 那解决了我的问题。我只是想让一些东西出现在别的东西的另一边。谢谢你。 (2认同)

Stu*_*etz 24

@Jannis,如果你想继续在回答这个,还有就是实际控制单个节点放置的方式-使用"POS"属性:

http://www.graphviz.org/doc/info/attrs.html#d:pos

作为一个例子,你可以写:

n [pos="3,5!"];
Run Code Online (Sandbox Code Playgroud)

这会迫使节点n处于精确状态(3,5).

但是,这仅适用于布局引擎"fdp"和"neato".

  • `pin`属性(!),是"fdp,neato only"(它不适用于dot).所以使用`pos`对于dot是没有意义的,除非你绕过点布局引擎. (19认同)

tjv*_*jvr 14

我喜欢@smokris的[style=invis]技巧,说服graphviz把东西放在你想要的地方,通过添加影响布局但不可见的边缘.


另一个技巧是constraint属性,它允许您添加可见但不影响布局的边.

如果添加新边缘[constraint=false]会使图形混乱,请设置在该边缘上:现在,graphviz会在放置节点时忽略它.

如果false,边缘不用于对节点进行排名.例如,在图表中

digraph G {
    a -> c;
    a -> b;
    b -> c [constraint=false];  
}
Run Code Online (Sandbox Code Playgroud)

b -> c在秩分配期间,边缘不会添加约束,因此唯一的约束是a高于b和c,产生图形:


Win*_*ith 8

我不知道有任何方法可以控制各个节点的位置.它没有多大意义,因为为了做到这一点,你需要知道最终图形的样子,然而手动放置一个节点会改变图形的其余部分的呈现方式.

我通过更改.dot文件中定义节点的顺序,并在图形级别调整nodesepranksep属性来解决此问题.这是一个细化的过程 - 一次调整一些东西,直到它看起来正确.

您也可以将图形渲染为SVG,然后将其导入Visio(或其他编辑器)并手动重新排列您不满意的节点.

  • 这是不正确的,不应该是接受的答案.下面的答案分别为30和20票,每一票都是一个很好的接受答案. (3认同)
  • 我不认为 Visio 可以编辑通用 svg,但 Inkscape 可以。 (2认同)