我正在使用graphviz(点)生成您可以在下面看到的图表。左下角的节点(红色椭圆)因其边缘穿过相邻节点的几个边缘而引起烦恼。有没有办法将节点放置到某个区域?
答案 0 :(得分:46)
您可以创建一个不可见的约束,使红色节点出现在所有其他节点的左侧。
redNode -> leftmostNode [style=invis];
在:
后:
答案 1 :(得分:23)
@Jannis,如果你仍然对这个问题的答案感兴趣,那么 实际上是一种控制个别节点位置的方法 - 你使用“pos”属性:
http://www.graphviz.org/doc/info/attrs.html#d:pos
作为一个例子,你可以写:
n [pos="3,5!"];
这将迫使节点n
精确地(3,5)
。
但是,这仅适用于布局引擎“fdp”和“neato”。
答案 2 :(得分:12)
我喜欢@ smokris'通过添加影响布局但不可见的边缘,说服graphviz将内容放在您想要的位置的[style=invis]
技巧。
另一个技巧是constraint
attribute,它允许您添加可见但不会影响布局的边缘。
如果添加新边缘会使图表混乱,请在该边缘设置[constraint=false]
:现在,graphviz会在放置节点时忽略它。
如果
false
,则边缘不用于对节点进行排名。例如,在 图表digraph G { a -> c; a -> b; b -> c [constraint=false]; }
边缘
b -> c
在排名分配期间不添加约束,因此唯一的约束是a 在b和c之上,产生图表:
答案 3 :(得分:10)
我不知道有任何方法可以控制各个节点的位置。它没有多大意义,因为为了做到这一点,你需要知道最终图形的样子,然而手动放置一个节点会改变图形的其余部分的呈现方式。
我通过更改.dot
文件中定义节点的顺序,并在图表级别调整nodesep
和ranksep
属性来解决此问题。这是一个改进的过程 - 一次调整一些东西,直到看起来正确。
您也可以将图表呈现为SVG
,然后将其导入Visio(或其他编辑器)并手动重新排列您不满意的节点。