假设此代码使用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
}
这给了我们这个图表:
我需要的是放置一个节点X
,它总是固定在父节点以南的位置。即如果我放了另一个关系A -- X
,X
应始终位于A
以南。而且我并不关心其他所有事情的结局。
我查看了pos
属性,但它似乎不是解决方案,因为X
并非真正处于固定位置,而是处于相对于其关系的位置。< / p>
同样是tailport
和headport
,但它们只定义边缘出/中的位置,但不会真正影响节点的方向。
更新
使图像更清晰的附加图像:
我不需要neato,但我不希望图形看起来像UD或LR点树,我不希望它是线性排序的。 circo,fdp,sfdp,twopi也没关系。
答案 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
我尝试使用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,我会得到附加的图片。
Graphviz属性文档http://www.graphviz.org/content/attrs提供了有关这些属性的更多信息。