在graphviz上设置节点方向

时间:2012-01-10 19:43:18

标签: graphviz dot neato

假设此代码使用neato:

graph sample {
  layout=neato
  overlap=false
  splines=true
  tailclip=false
  headclip=false
  A -- I
  A -- J
  A -- B
  A -- H
  A -- E
  A -- K
  B -- D
  B -- C
  B -- L
  C -- M
  C -- N
  C -- O
  D -- P
  D -- Q
  E -- R
  F -- A
  G -- F
  H -- J
}

这给了我们这个图表:

neato diagram

我需要的是放置一个节点X,它总是固定在父节点以南的位置。即如果我放了另一个关系A -- XX应始终位于A以南。而且我并不关心其他所有事情的结局。

我查看了pos属性,但它似乎不是解决方案,因为X并非真正处于固定位置,而是处于相对于其关系的位置。< / p>

同样是tailportheadport,但它们只定义边缘出/中的位置,但不会真正影响节点的方向。

更新

使图像更清晰的附加图像:

x should be south from his parent

我不需要neato,但我不希望图形看起来像UD或LR点树,我不希望它是线性排序的。 circo,fdp,sfdp,twopi也没关系。

2 个答案:

答案 0 :(得分:4)

为了响应更新的约束,一个解决方案是固定A和X,然后围绕它们布置图形:

graph sample {
overlap=false;
splines=true;
tailclip=false;
headclip=false;

A [pin=true,pos="0,.2"]
X [pin=true,pos="0,.1"]
A -- I
A -- J
A -- B
A -- H
A -- E
A -- K
B -- D
B -- C
B -- L
C -- M
C -- N
C -- O
D -- P
D -- Q
E -- R
F -- A
G -- F
H -- J
A -- X

graph output

我尝试使用neato和fdp进行布局,它似乎生成了一个你想要的图形。当然,如果您想对同一图表中的任意节点对施加此类约束,则此解决方案可能无效。

---早期答案---

如果你致力于使用neato,我不确定有没有办法解决问题,而无需在后处理步骤中修改图形。如果neato只是一个方便的默认值,那么你应该能够通过使用dot作为你的布局引擎来解决你的问题,并使用“rankdir = UD”,如果X需要在南方,还要使用几个额外的kludges。

如果您只需要约束来申请单个节点X,那么将X和A放在一个集群中就可以完成这项工作:

graph sample {
  rankdir=UD 
  layout=dot
  overlap=false
  // .. as before
  A -- X
  subgraph clusterone {
   style=invisible
   A
   X
  }
}

如果你需要一个严格的南方约束来应用于A的任意子级,那么这种聚类后面跟着描述的技巧:

How to force all nodes in the same column in graphviz?

可能会成功。在这种情况下,属性clusterrank=local也可能有用,但我不确定。希望这会有所帮助。

答案 1 :(得分:4)

neato程序支持多种模式,其中一种模式可能会为您提供所需的模式。特别是,如果设置mode = ipsep,则可以指定布局期间遵循的类似于点的约束。例如,我使用图表并使用图表属性

mode=ipsep
diredgeconstraints=true
levelsgap=0.5

第一个打开ipsep模式,第二个打开模型支持有向边,如点, 最后一个指定了分离的强度。然后我将edge dir属性设置为none

edge[dir=none]

并添加边A - X [dir = 1]

dir = 1表示此边缘应引起方向约束。如果我然后运行neato,我会得到附加的图片。

neato layout

Graphviz属性文档http://www.graphviz.org/content/attrs提供了有关这些属性的更多信息。