206

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

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

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

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";
}

在此处输入图像描述

4

3 回答 3

242

DOT 用户手册给出了以下集群图示例,集群之间有边:

重要提示:初始compound=true声明是必需的。

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;
}

...以及节点和集群之间的边:

在此处输入图像描述

于 2010-01-06T10:03:29.590 回答
101

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

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];
}

compound=true声明中的graph至关重要。这会产生输出:

具有连接集群的图

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

关于可能想要连接其中没有节点的集群的担忧,我的解决方案是始终向每个集群添加一个节点,以 style=plaintext 呈现。使用此节点来标记集群(而不是集群的内置“label”属性,该属性应设置为空字符串(在 Python 中label='""')。这意味着我不再添加直接连接集群的边,但它在我的特殊情况下工作。

于 2012-05-29T16:11:01.793 回答
13

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

于 2012-10-11T23:14:21.427 回答