dot中的子图集群排名

时间:2010-03-23 10:25:16

标签: graphviz dot

我正在尝试在media wiki上使用graphviz作为软件的文档工具。

首先,我记录了一些运作良好的阶级关系。一切都按预期垂直排列。

但是,然而,我们的一些模块是dll,我想分成一个盒子。当我将节点添加到集群时,它们已经过了边缘,但集群似乎有一个LR排名规则。或者被添加到群集中会破坏节点的TB排名,因为群集现在显示在图表的一侧。

此图表代表我要做的事情:目前,cluster1和cluster2出现在cluster0的 right

我希望/需要它们出现在下面。

<graphviz>
digraph d {
    subgraph cluster0 {
      A -> {B1 B2}
      B2 -> {C1 C2 C3}
      C1 -> D;
    }
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }
    subgraph cluster2 { 
      C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}
</graphviz>

3 个答案:

答案 0 :(得分:11)

答案 1 :(得分:3)

我的经验表明,constraint=false通常会产生不必要的复杂边缘。 weight=0似乎可以提供更好的结果:

digraph d {
    subgraph cluster0 {
        A -> {B1 B2}    
        B2 -> {C1 C2 C3}
        C1 -> D;
    }
    subgraph cluster1 {
        C2 -> dll1_A [minlen = 2];
        dll1_A -> B1 [weight = 0];
        /* B1 -> dll1_A [dir = back]; */
    }
    subgraph cluster2 {
        C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}

答案 2 :(得分:0)

这将生成您正在寻找的图表:

digraph d {
  subgraph cluster0 {
    A -> {B1 B2}
    B2 -> {C1 C2 C3}
    C1 -> D;
  }

  subgraph {
    rankdir="TB"
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }

    subgraph cluster2 {
      C3 -> dll2_A;
    }
  }
  dll1_A -> dll2_A;
}

这样做是创建一个子图,仅用于布局目的,以提供您想要的自上而下的排序。