Graphviz - 对齐节点和集群
Graphviz - aligning nodes and clusters
我正在尝试使用 Graphviz 绘制有限状态图,但我无法如愿以偿。这是我到目前为止所写的内容:
digraph G {
rankdir = LR;
subgraph cluster_op1 {
subgraph cluster_0 {
1 -> 2 [label="a"]
}
subgraph cluster_1 {
3 -> {4 6} [label="ε"]
4 -> 5 [label="b"]
5 -> 4 [label="ε"]
5 -> 6 [label="ε"]
}
subgraph cluster_2 {
7 -> {8 10} [label="ε"]
8 -> 9 [label="c"]
9 -> 8 [label="ε"]
9 -> 10 [label="ε"]
}
2 -> 3 [label="ε"]
6 -> 7 [label="ε"]
}
subgraph cluster_op2 {
subgraph cluster_3 {
11 -> {12 14} [label="ε"]
12 -> 13 [label="ab"]
13 -> 12 [label="ε"]
13 -> 14 [label="ε"]
}
subgraph cluster_4 {
15 -> 16 [label="c"]
}
14->15 [label="ε"]
}
0 -> {1 11} [label="ε"]
{10 16} -> 17 [label="ε"]
}
这是它的样子:
我想要的是:
cluster_op1
中的所有节点水平对齐(cluster_op2
相同)
cluster_op2
在 cluster_op1
下方居中
- 从节点
0
到 cluster_op1
和 cluster_op2
的边长度相同(从这两个集群到节点 17
的边相同)
这是一个 hack,而不是一个真正的解决方案,但它可以满足您的需求,至少对于此处介绍的案例是这样。
它使用三个元素:
组方便节点间直线,
weight 如果一个节点指向另外两个节点(所有这些节点都在同一组中)而感到困惑,则可以提供帮助;并使集群在它们之间对齐,
invis 边缘对齐 cluster_op2
低于 cluster_op1
- 所以它不是居中而是手动调整。
此外,我已在适用的地方将 b -> a
替换为 a -> b[ dir = back ]
;我认为这是避免难以发现的错误的良好做法。
这是您编辑的代码:
digraph G {
rankdir = LR;
0, 1, 2, 15, 16, 17
3, 4, 5, 6 [ group = 1 ];
7, 8, 9, 10 [ group = 2 ];
11, 12, 13, 14 [ group = 3 ];
2 -> 11[ style = invis ];
subgraph cluster_op1 {
subgraph cluster_0 {
1 -> 2 [ label="a" ];
}
subgraph cluster_1 {
3 -> 4 [ label="ε", weight = 4 ];
3 -> 6 [ label="ε" ];
4 -> 5 [ label="b" ];
4 -> 5 [ label="ε", dir = back];
5 -> 6 [ label="ε", weight = 4 ];
}
subgraph cluster_2 {
7 -> {8 10} [label="ε"]
8 -> 9 [label="c"]
8 -> 9 [ label="ε", dir = back ];
9 -> 10 [label="ε"]
}
2 -> 3 [ label="ε", weight = 10 ;]
6 -> 7 [ label="ε" ];
}
subgraph cluster_op2 {
subgraph cluster_3 {
11 -> 12 [ label="ε", weight = 4 ];
11 -> 14 [ label="ε" ];
12 -> 13 [ label="ab" ];
12 -> 13 [ label="ε", dir = back ];
13 -> 14 [ label="ε", weight = 4 ];
}
subgraph cluster_4 {
15 -> 16 [label="c"]
}
14->15 [ label="ε", weight = 10 ];
}
0 -> {1 11} [label="ε"]
{10 16} -> 17 [label="ε"]
}
产生
我正在尝试使用 Graphviz 绘制有限状态图,但我无法如愿以偿。这是我到目前为止所写的内容:
digraph G {
rankdir = LR;
subgraph cluster_op1 {
subgraph cluster_0 {
1 -> 2 [label="a"]
}
subgraph cluster_1 {
3 -> {4 6} [label="ε"]
4 -> 5 [label="b"]
5 -> 4 [label="ε"]
5 -> 6 [label="ε"]
}
subgraph cluster_2 {
7 -> {8 10} [label="ε"]
8 -> 9 [label="c"]
9 -> 8 [label="ε"]
9 -> 10 [label="ε"]
}
2 -> 3 [label="ε"]
6 -> 7 [label="ε"]
}
subgraph cluster_op2 {
subgraph cluster_3 {
11 -> {12 14} [label="ε"]
12 -> 13 [label="ab"]
13 -> 12 [label="ε"]
13 -> 14 [label="ε"]
}
subgraph cluster_4 {
15 -> 16 [label="c"]
}
14->15 [label="ε"]
}
0 -> {1 11} [label="ε"]
{10 16} -> 17 [label="ε"]
}
这是它的样子:
我想要的是:
cluster_op1
中的所有节点水平对齐(cluster_op2
相同)cluster_op2
在cluster_op1
下方居中
- 从节点
0
到cluster_op1
和cluster_op2
的边长度相同(从这两个集群到节点17
的边相同)
这是一个 hack,而不是一个真正的解决方案,但它可以满足您的需求,至少对于此处介绍的案例是这样。
它使用三个元素:
组方便节点间直线,
weight 如果一个节点指向另外两个节点(所有这些节点都在同一组中)而感到困惑,则可以提供帮助;并使集群在它们之间对齐,
invis 边缘对齐 cluster_op2
低于 cluster_op1
- 所以它不是居中而是手动调整。
此外,我已在适用的地方将 b -> a
替换为 a -> b[ dir = back ]
;我认为这是避免难以发现的错误的良好做法。
这是您编辑的代码:
digraph G {
rankdir = LR;
0, 1, 2, 15, 16, 17
3, 4, 5, 6 [ group = 1 ];
7, 8, 9, 10 [ group = 2 ];
11, 12, 13, 14 [ group = 3 ];
2 -> 11[ style = invis ];
subgraph cluster_op1 {
subgraph cluster_0 {
1 -> 2 [ label="a" ];
}
subgraph cluster_1 {
3 -> 4 [ label="ε", weight = 4 ];
3 -> 6 [ label="ε" ];
4 -> 5 [ label="b" ];
4 -> 5 [ label="ε", dir = back];
5 -> 6 [ label="ε", weight = 4 ];
}
subgraph cluster_2 {
7 -> {8 10} [label="ε"]
8 -> 9 [label="c"]
8 -> 9 [ label="ε", dir = back ];
9 -> 10 [label="ε"]
}
2 -> 3 [ label="ε", weight = 10 ;]
6 -> 7 [ label="ε" ];
}
subgraph cluster_op2 {
subgraph cluster_3 {
11 -> 12 [ label="ε", weight = 4 ];
11 -> 14 [ label="ε" ];
12 -> 13 [ label="ab" ];
12 -> 13 [ label="ε", dir = back ];
13 -> 14 [ label="ε", weight = 4 ];
}
subgraph cluster_4 {
15 -> 16 [label="c"]
}
14->15 [ label="ε", weight = 10 ];
}
0 -> {1 11} [label="ε"]
{10 16} -> 17 [label="ε"]
}
产生