将宽图的相同等级上的节点分配到不同的行

haz*_*dco 9 dot graphviz nodes

我有一个图表(organigram)如何:

digraph G {
nodesep=0.3;
ranksep=0.2;
margin=0.1;
node [shape=rectangle];
edge [arrowsize=0.8];
1 -> 2;
1 -> 3;
1 -> 4;
1 -> 5;
1 -> 6;
1 -> 7;
1 -> 8;
1 -> 9;
1 -> 10;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我有70人的组织结构,不可能用A4打印.如何将节点放入2或3行?

mar*_*pet 17

这有两种可能性(另见这个问题):

1.使用该unflatten实用程序

Graphviz提供了一个名为的工具unflatten.如果使用此命令行预处理图形:

unflatten -l 3 wide.gv | dot -Tpng -o wide.png
Run Code Online (Sandbox Code Playgroud)

输出图像类似于下图.这稍微宽一些,您可以使用该-l选项.

graphviz unflattened graph示例

2.使用`rank = same'和不可见边

您可以使用标准技术使自动布局的图形看起来更像您想要的:

  • rank=same分组子图中的节点,并定义哪些节点应在同一行上
  • 不可见的边缘,以确保不同的子图出现在不同的等级上
  • 可能有些constraint=false边缘会影响布局
  • group 节点的属性以鼓励直边.

输出图不一定比较漂亮......

这是一个例子,你可以做得更好.此外,如果动态生成图形,这可能不太实用.

digraph G {
nodesep=0.3;
ranksep=0.2;
margin=0.1;
node [shape=rectangle];
edge [arrowsize=0.8];


edge[style=invis];
node[group=a];
2->5->8;
node[group=b];
1->3->6->9;
node[group=c];
4->7->10;


edge[style=solid];
1 -> 2;
1 -> 3;
1 -> 4;
edge[constraint=false];
1 -> 5;
1 -> 6;
1 -> 7;
1 -> 8;
1 -> 9;
1 -> 10;
}
Run Code Online (Sandbox Code Playgroud)

graphviz输出