13

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

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

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

这张图代表了我正在尝试做的事情:目前,cluster1 和 cluster2 出现在 cluster0 的右侧

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

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

4

3 回答 3

13

布局是 Dot 尝试最小化整体高度的一种尝试。

比所需布局更紧凑的一个原因是使用了从dll1_aB1的反向边缘。它尝试将集群拉回尽可能靠近目标节点的位置。为了避免这条边影响图形,要么如图所示放松对向上边的约束,要么在向前方向绘制边并使用dir属性来反转箭头。

这将有助于许多布局,但仅靠它不足以修复给出的示例。为了防止 Dot 保持它喜欢的紧凑布局,您可以将minlen属性添加到应保持(接近)垂直的边缘。这通常可能难以计算,但对于手动调整的布局是实用的。

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

更正的布局

于 2010-07-25T12:08:56.250 回答
6

我的经验表明,这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;
}
于 2015-03-04T13:50:07.393 回答
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;
}

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

于 2010-07-21T21:52:12.967 回答