代码之家  ›  专栏  ›  技术社区  ›  Winston Smith

如何连接子图?

  •  140
  • Winston Smith  · 技术社区  · 15 年前

    dot language for graphviz 中,我正在尝试表示依赖关系图。我需要能够在容器中拥有节点,并且能够使节点和/或容器依赖于其他节点和/或容器。

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

    根据下面的程序,我需要能够用箭头连接 cluster_1和 cluster_2,但我尝试过的任何操作都会创建新节点,而不是连接群集:

    有向图G{ graph[fontsize=10 fontname=“Verdana”]; 节点[shape=record fontsize=10 fontname=“Verdana”]; 子图簇\0{ 节点[样式=填充]; “项目1”“项目2”; label=“容器A”; 颜色=蓝色; } 子图簇{ 节点[样式=填充]; “项目3”“项目4”; label=“容器B”; 颜色=蓝色; } 子图簇{ 节点[样式=填充]; “项目5”“项目6”; label=“容器C”; 颜色=蓝色; } /罚款 “项目1”->“项目2”; “项目2”->“项目3”; //这两个都创建新节点 集群_1->集群_2; “容器A”->“容器C”; } < /代码>

    =

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

    根据下面的程序,我需要能够连接 cluster_1 cluster_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";
    }
    

    3 回复  |  直到 7 年前
        1
  •  150
  •   Potherca Zaid Amireh    11 年前

    DOT用户手册给出了一个图的以下示例,该图具有集群之间的边。

    有向图G{ 化合物=真; 子图群集0{ A & GT;B; A & GT;C; B-GT; C & GT; } 子图组合1{ e & gt; e & gt;f; } b->f[lhead=cluster1]; D & gt; C->G[ltail=cluster0,lhead=cluster1]; C->E[ltail=cluster0]; D & gt; } < /代码>

    以及节点和簇之间的边。

    簇间H边

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

    以及节点和簇之间的边。

    enter image description here

        2
  •  76
  •   qfazille    7 年前

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

    有向图G{ 图形[fontsize=10 fontname=“Verdana”复合=真]; 节点[shape=record fontsize=10 fontname=“Verdana”]; 子图簇\0{ 节点[样式=填充]; “项目1”“项目2”; label=“容器A”; 颜色=蓝色; } 子图簇{ 节点[样式=填充]; “项目3”“项目4”; label=“容器B”; 颜色=蓝色; } 子图簇{ 节点[样式=填充]; “项目5”“项目6”; label=“容器C”; 颜色=蓝色; } //节点之间的边渲染精细 “项目1”->“项目2”; “项目2”->“项目3”; //直接将一个群集连接到另一个群集的边缘 “项目1”->“项目3”[ltail=集群_0 lhead=集群_1]; “第1项”->“第5项”[ltail=cluster_0 lhead=cluster_2]; } < /代码>

    图中的 复合=真 声明至关重要。产生输出:

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

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

    直接应用于原始问题,如下所示:

    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 宣言至关重要。产生输出:

    graph with connected clusters

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

    关于担心可能需要连接一个没有节点的集群,我的解决方案是 总是 向每个集群添加一个节点,以样式=纯文本呈现。使用此节点标记集群(而不是集群的内置“label”属性,该属性应设置为空字符串(在python中, label='""' )这意味着我不再添加直接连接簇的边,但它在我的特定情况下工作。

        3
  •  8
  •   mihajlv    13 年前

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

    推荐文章