GraphViz – 如何连接子图?
在GraphViz
的DOT
语言中,我试图表示一个依赖关系图。 我需要能够有一个容器内的节点,并能够使节点和/或容器依赖于其他节点和/或容器。
我使用subgraph
来表示我的容器。 节点链接工作得很好,但我不知道如何连接子图。
鉴于下面的程序,我需要能够用箭头连接cluster_1
和cluster_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
支持集群。