GraphViz – 如何连接子图?

GraphVizDOT语言中,我试图表示一个依赖关系图。 我需要能够有一个容器内的节点,并能够使节点和/或容器依赖于其他节点和/或容器。

我使用subgraph来表示我的容器。 节点链接工作得很好,但我不知道如何连接子图。

鉴于下面的程序,我需要能够用箭头连接cluster_1cluster_2 ,但是我尝试过的任何事情都会创build新的节点,而不是连接集群:

 digraph G { graph [fontsize=10 fontname="Verdana"]; node [shape=record fontsize=10 fontname="Verdana"]; subgraph cluster_0 { node [style=filled]; "Item 1" "Item 2"; label = "Container A"; color=blue; } subgraph cluster_1 { node [style=filled]; "Item 3" "Item 4"; label = "Container B"; color=blue; } subgraph cluster_2 { node [style=filled]; "Item 5" "Item 6"; label = "Container C"; color=blue; } // Renders fine "Item 1" -> "Item 2"; "Item 2" -> "Item 3"; // Both of these create new nodes cluster_1 -> cluster_2; "Container A" -> "Container C"; } 

在这里输入图像说明

DOT用户手册给出了以下集群边缘集群图的例子

 digraph G { compound=true; subgraph cluster0 { a -> b; a -> c; b -> d; c -> d; } subgraph cluster1 { e -> g; e -> f; } b -> f [lhead=cluster1]; d -> e; c -> g [ltail=cluster0,lhead=cluster1]; c -> e [ltail=cluster0]; d -> h; } 

以及节点和群集之间的边缘。

在这里输入图像说明

为便于参考,HighPerformanceMark的答案中所描述的解决scheme直接应用于原始问题,如下所示:

 digraph G { graph [fontsize=10 fontname="Verdana" compound=true]; node [shape=record fontsize=10 fontname="Verdana"]; subgraph cluster_0 { node [style=filled]; "Item 1" "Item 2"; label = "Container A"; color=blue; } subgraph cluster_1 { node [style=filled]; "Item 3" "Item 4"; label = "Container B"; color=blue; } subgraph cluster_2 { node [style=filled]; "Item 5" "Item 6"; label = "Container C"; color=blue; } // Edges between nodes render fine "Item 1" -> "Item 2"; "Item 2" -> "Item 3"; // Edges that directly connect one cluster to another "Item 1" -> "Item 3" [ltail=cluster_0 lhead=cluster_1]; "Item 1" -> "Item 5" [ltail=cluster_0 lhead=cluster_2]; } 

并产生输出:

与连接的群集图

请注意,我将边缘更改为集群内的引用节点,将ltail和lhead属性添加到每条边,指定集群名称,并添加图层属性“compound = true”。

考虑到人们可能想要连接一个内部没有节点的集群,我的解决scheme是总是为每个集群添加一个节点,并使用style = plaintext来呈现。 使用这个节点来标记集群(而不是集群的内置“标签”属性,应该设置为空string(在Python中, label='""' )。这意味着我不再添加边缘直接连接群集,但它在我的特定情况下工作。

确保你正在使用文件的fdp布局。 我不认为neato支持集群。