连接集群时集群的中心对齐

Center alignment of clusters when connecting them

我有两个连接的集群,但我似乎无法将最左边的集群(节点 nd_6)与另一个节点(cluster_circ)的中心对齐。这是一个例子:

digraph d1 {
  # configs
  rankdir = "LR";
  compound=true;
  node [shape = plaintext];
  edge [arrowhead = "vee"];

  nd_1 [group = g1]
  nd_2 [group = g1]

  # cluster for circular pattern
  subgraph cluster_circ {
    color=none;
    node [shape = plaintext];
    nd_3 [group = g1]
    {rank=same nd_4[group = g2]; nd_5[group = g3]};
    nd_3 -> nd_4:nw;
    nd_4 -> nd_5:ne; 
    nd_5 -> nd_3:se;
  }

  # right-most cluster
  subgraph cluster_r {
    color=none;
    node [shape = plaintext];
    nd_6 [group = g1];
  }

  # edge connections
  nd_1 -> nd_2; 
  nd_2 -> nd_3;

  # connect clusters
  nd_5 -> nd_6 [ltail=cluster_circ lhead=cluster_r]
}

生成以下结果:

我想要实现的是将节点 nd_6 及其连接到 cluster_circ 的相应边与 nd_3 对齐。

谢谢!

你需要做两件事来实现你的目标:

  • 匹配你的罗盘点
  • 从 nd_4 有一个不可见的边缘,向上移动 nd_6

这两项在下面的源代码注释中都有解释。在编辑过程中,为了方便阅读,我删除了很多不符合上下文的内容material。

digraph d1 
{
  // configs                      // comment characters changed to "standard"
  rankdir = "LR";
  node [ shape = plaintext ];
  edge [ arrowhead = "vee" ];

  // nodes
  nd_1 nd_2 nd_3;
  { rank=same; nd_4 nd_5 }
  nd_6

  // edges / connections
  nd_1 -> nd_2 -> nd_3;

  nd_3 -> nd_4:nw;                  // matching :s and :n keeps the center:
  nd_4:se -> nd_5:ne;               // balance nd_4:n with nd_4:s
  nd_3 -> nd_5:sw[ dir = back ];    // balance nd_5:n with nd_5:s

  nd_4 -> nd_6[ style = invis  ];   // this gives you a counterweight 
  nd_5 -> nd_6;                     // to nd_5 and thus "centers" nd_6
}

产量

E D I T 以显示具有空节点的备选方案。 这是我最喜欢的结果,我插入了一些行,您可以在其中尝试其他设置。据我所知,组或子图没有帮助,因为边只在节点之间,而不是在集群之间。

digraph d1 
{
  // configs                    // comment characters changed to "standard"
  rankdir = "LR";
  node [ shape = plaintext ];
  edge [ arrowhead = "vee" ];

  // nodes
  nd_1 nd_2 nd_3;
  x[ shape = point, height = 0 ];    // "empty" node
      // x[ shape = point, height = .25, color = white ];   // alternative
  { rank = same; nd_4 nd_5 }        
      // { rank = same; nd_4 x nd_5 }   // try also with x in the same rank
  nd_6

  // edges / connections
  nd_1 -> nd_2 -> nd_3;

  nd_3 -> nd_4:nw;
  nd_4:e -> x:n[ dir = none ];      // route edge via x
  x:s -> nd_5:e;                    // you can try other compass points
  nd_3 -> nd_5:sw[ dir = back ];    // balance nd_4:n with nd_5:s

  x -> nd_6;                        // connect the empty node in the middle
}

产生