是否可以告诉 GraphViz (Dot) 尝试在不拉伸任一维度的情况下排列图形的节点?例如,如果我创建一个包含 25 个节点且没有边的图形,GraphViz 会将它与所有节点显示在一行中。我想要的是获得一个 5 x 5 的节点“字段”。
rank=same 结合隐形边缘是您的朋友:
digraph Test
{
nodesep = 0.5; // even node distribution
node [ shape = circle, width = 0.7 ];
edge [ style = invis ];
{ rank = same; A; B; C; D; E }
{ rank = same; F; G; H; I; J }
{ rank = same; K; L; M; N; O }
{ rank = same; P; Q; R; S; T }
{ rank = same; U; V; W; X; Y }
C -> { F G H I J }
H -> { K L M N O }
M -> { P Q R S T }
R -> { U V W X Y }
}
Run Code Online (Sandbox Code Playgroud)
而不是最后四行,你可以简单地使用
A -> F -> K -> P -> U;
Run Code Online (Sandbox Code Playgroud)
这将导致给定节点的相同结果,但当节点大小变化时可能不太稳定。
您可以强制 Graphviz 中节点的位置,尽管它不适用于点引擎。这意味着您必须想出一种算法来指定节点的位置。
看这个问题:How to Force Node Position (x and y) in graphviz
或者,您可以使用不可见的边缘:
nodeA -> nodeB [style=invis]
Run Code Online (Sandbox Code Playgroud)
并在节点之间创建网格,这可能会导致引擎以有序的方式排列节点。
在这两种情况下,您都必须通过指定节点的位置或将它们连接在一起来指定如何排列节点。