GraphViz - 如何使子图包含形状?

4

我有一张图表,代表了由两个小进程组成的一个大进程。每个小进程都被一个子图表示。但是当我将其中一个子进程(比如说“one”)的结尾连接到另一个子进程(“two”)的开头时,“two”进程的起始形状会出现在“one”的结束点所在的同一集群中。如何使从“one”的结尾指向“two”的开头的箭头,同时保持“two”的起始形状在其自己的集群中?

digraph BigProcess {
   graph [ label="Some big process" ]

   subgraph clusterSubProcess1 {
      graph [ label="Subprocess one", color="red" ]

      start1_1 -> start1_2;
      start1_2 -> start1_3a;
      start1_2 -> start1_3b;
      start1_3a -> start1_4;
      start1_3b -> start1_5;
      start1_4 -> start1_1;
      start1_5 -> start2_1;

   }

   subgraph clusterSubProcess2 {
      graph [ label="Subprocess two", color="blue" ]

      start2_1 -> start2_2;
      start2_2 -> start2_3a;
      start2_2 -> start2_3b;
      start2_3a -> start2_4;
      start2_3b -> start2_5;
      start2_4 -> start2_1;
      start2_5 -> end1;

   }
}

这将导致以下结果,我真的希望start2_1成为蓝色边框框内的顶级节点。

这个图


你尝试过除了边缘之外还声明节点吗?我可能会尝试将节点放入簇中,而不是边缘。(我认为边缘最好在簇之外声明。)抱歉我现在不在电脑旁,否则可以给出一个更好的答案。 - Erik Eidt
1个回答

8
这是因为第一个子图中的代码行 start1_5 -> start2_1; 定义了该子图中的 start2_1。您需要在第一个子图中定义 start1_5,但在第二个子图中定义 start2_1之后再连接它。
digraph BigProcess {
   graph [ label="Some big process" ]

   subgraph clusterSubProcess1 {
      graph [ label="Subprocess one", color="red" ]

      start1_1 -> start1_2;
      start1_2 -> start1_3a;
      start1_2 -> start1_3b;
      start1_3a -> start1_4;
      start1_3b -> start1_5;
      start1_4 -> start1_1;
      start1_5;

   }

   subgraph clusterSubProcess2 {
      graph [ label="Subprocess two", color="blue" ]

      start2_1 -> start2_2;
      start2_2 -> start2_3a;
      start2_2 -> start2_3b;
      start2_3a -> start2_4;
      start2_3b -> start2_5;
      start2_4 -> start2_1;
      start2_5 -> end1;

   }

   //Now connect the nodes in the two different subgraphs
   start1_5 -> start2_1;
}

Node in the desired subgraph


谢谢!现在看起来很明显,但我已经好几年没有使用DOT/GraphViz了,现在才重新开始。 - Jeremy Thomerson
实际上,您可以删除单个的 start1_5;,因为您已经在 start1_3b -> start1_5; 行中定义了该节点: - juandesant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接