Graphviz:禁止水平边缘,始终显示垂直方向

时间:2015-05-19 16:00:00

标签: graphviz directed-acyclic-graphs

我有一个有向无环图,我试图使用Graphviz的dot进行可视化。默认情况下,它是从上到下排列的。

通常,所有定向边的头部都比尾部低。但在某些情况下,它们被画成水平直线部分,即头部和尾部处于同一水平。在我的情况下,这发生在我定义子图簇之后。

他们是否可以禁止此操作并强制它始终定位节点,以便箭头指向“向下”?

示例来源:

digraph {
  rankdir=TB;
  subgraph cluster_1 { "8"; "7"; "9"; "11"; "10" }
  subgraph cluster_2 { "3"; "4"; "5"; }

  "1" -> "3";
  "2" -> "5";
  "3" -> "6";
  "3" -> "5";
  "2" -> "8";
  "2" -> "4";
  "2" -> "3";
  "2" -> "6";
  "2" -> "7";
  "1" -> "8";
  "7" -> "8";
  "4" -> "6";
  "6" -> "10";
  "3" -> "11";
  "7" -> "10";
  "7" -> "6";
  "1" -> "2";
  "6" -> "5";
  "7" -> "9";
  "7" -> "5";
  "4" -> "5";
  "6" -> "8";
  "3" -> "4";
  "10" -> "11";
  "4" -> "11";
  "3" -> "8";
  "8" -> "9";
  "6" -> "9";
  "9" -> "10";
  "3" -> "10";
  "3" -> "7";
}

2 个答案:

答案 0 :(得分:2)

我知道这是一个老问题,但是我将提供此答案以供将来参考:

您可以使用begin="2s",它根据graphviz.org website执行以下操作:

  

dot中的原始排序算法在群集上是递归的。这样可以产生较少的等级和更紧凑的布局,但是有时会以将头节点放置在比尾节点更高的等级上为代价。它还假定节点不受单独的不兼容子图中的约束。例如,一个节点不能位于群集中,并且受rank = same约束,而节点不在群集中。

     

如果newrank = true,则排名算法执行单个全局排名,而忽略集群。这允许节点受到多个约束。等级约束通常将优先于边缘约束。

因此您的来源仅更改如下:

newrank = true;

对于此示例,结果将更好:

enter image description here

答案 1 :(得分:1)

该行为是由修复内部节点排名的集群引起的。来自外边缘的'强制'确实水平拉节点,但对等级没有影响。

您必须避免群集或插入不可见的节点和边缘。

显示排名修复的最小示例

digraph {
    subgraph cluster_1 {
        1
        3
    }
    1 -> 2
    2 -> 3
}

enter image description here