This answer描述了如何将GraphViz集群连接到节点和其他集群。
我想将一个集群连接到自身,因此箭头退出集群边界并重新进入(想想一个转换为自身的状态机)。
以下是一个例子:
digraph example {
compound=true;
"B" -> "C" [ltail="cluster_s0", lhead="cluster_s1", minlen=2];
"D" -> "C" [ltail="cluster_s1", lhead="cluster_s1", minlen=2];
subgraph cluster_s0 {
"A" -> "B";
}
subgraph cluster_s1 {
"C" -> "D";
}
}
这会抛出警告并在集群内而不是外部绘制箭头:
这是我想要的(非常粗略)草图:
有没有办法让GraphViz从D
到C
绘制一个箭头,退出并重新进入群集边界,如上例所示?
这是另一种解决方法,虽然它有点难看,基本上你在子图外部放置一些额外的点节点并连接没有箭头的边缘,你也可能想要以相反的顺序连接它们以避免对布局产生奇怪的影响:
digraph example {
rankdir=LR
compound=true;
"B" -> "C" [ltail="cluster_s0", lhead="cluster_s1"];
"C" -> "DC1" [ltail="cluster_s1", dir=none];
DC1[shape=point]
DC2[shape=point]
DC1 -> DC2 [dir=none]
"DC2" -> "D" [lhead="cluster_s1"];
subgraph cluster_s0 {
"A" -> "B";
}
subgraph cluster_s1 {
"C" -> "D";
}
}
您可以通过添加一个不可见的虚拟节点来改善布局,但这可能不会扩展(我的猜测是您将难以确定何时添加虚拟节点)
digraph example {
rankdir=LR
compound=true;
"B" -> "C" [ltail="cluster_s0", lhead="cluster_s1"];
"C" -> "DC1" [ltail="cluster_s1", dir=back];
DC1[shape=point]
"DC2" -> "D" [lhead="cluster_s1"];
subgraph cluster_s0 {
"A" -> "B";
}
subgraph cluster_s1 {
"C" -> "D";
}
DD[shape=point color=none]
{D DC2}->DD[color=none]
}