连接群集时将它们居中对齐

时间:2018-12-31 05:22:37

标签: graphviz dot

我有两个相连的集群,但似乎无法将最左边的集群(具有节点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]
}

产生以下结果: enter image description here

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要做两件事才能实现目标:

  • 匹配您的指南针点
  • 在nd_4处有一条不可见的边缘,该边缘使nd_6向上移动。

这两项在下面的源代码注释中进行了说明。在编辑过程中,为了方便阅读,我删除了很多无关紧要的内容。

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
}

收益

enter image description here

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
}

产生

enter image description here