使用群集会反转rank = same的顺序

时间:2019-07-16 14:11:29

标签: graphviz dot

我有一个图,我将其设置为“ rankdir = LR;”。这样“ rank = same”将自上而下。

我决定在此图中添加一些聚类,但是结果是“ rank = same”现在从底部到顶部。

一个最小的示例显示了问题:

controller.destroy()

我想要的结果是从上到下:rank1,A,B,C。

我得到的结果是从上到下:C,B,A,rank1 ---如下图所示。

enter image description here

我该如何找回正确的订单?

  • 选项1:只是不使用群集。
  • 选项2:重写“ rank = same”行以适应从下到上的方向。

鉴于我的图表的大小,选项2的工作量太大,收益却很小。还有其他选择吗?

编辑:marapet给出的答案可以满足我的大部分要求。但是,该解决方案不适用于以下最小问题:

digraph graph {
graph [
    rankdir=LR;
    nodesep = "0.5 equally",
    newrank = true;
];

/* Guide Nodes */
rank1 [style=dotted];
rank2 [style=dotted];
rank1 -> rank2 [style=dotted];

/* Node Clusters */
subgraph cluster1 {
A;
B;
C;
}

/* Node Hierarchy */
A -> Z;
B -> Z;
C -> Z;

/* Node Rank */
{   rank=same;
rank1 -> A -> B -> C [style=dotted];
}

} /* Closes the digraph */

这将产生以下图片:

enter image description here

我只能得出结论,我遇到的问题是由于在同一等级的边缘中混合了群集和非群集而造成的。

2 个答案:

答案 0 :(得分:1)

对于相同等级的边缘,您可以使用rank=same来代替constraint=false

/* Node Rank */
rank1 -> A -> B -> C [style=dotted, constraint=false];

还应更改节点(引导节点和节点群集)的出现顺序:

digraph g {
graph [
    rankdir=LR;
    nodesep = "0.5 equally",
    newrank = true;
];

/* Node Clusters */
subgraph cluster1 {
A;
B;
C;
}

/* Guide Nodes */
rank1 [style=dotted];
rank2 [style=dotted];
rank1 -> rank2 [style=dotted];

/* Node Hierarchy */
A -> Z;
B -> Z;
C -> Z;

/* Node Rank */
rank1 -> A -> B -> C [style=dotted, constraint=false];
}

通常,对于LR布局,它有助于自上而下地布置图形并想象其逆时针旋转90度。

答案 1 :(得分:1)

要在问题中编辑的小扩展名。 在编辑中,使用了单独的节点'p',将其打包在子图中会产生更好的结果,尤其是在将颜色设置为白色时:

subgraph cluster3 {
P;
graph[color=white];
}

我的输出中唯一奇怪的是,'C'和'P'/之间有2条虚线/ 玩'dir = back'提供了解决方案。 完整的代码:

digraph g {
graph [
    rankdir=LR;
    nodesep = "0.5 equally",
    newrank = true;
];

/* Node Clusters */
subgraph cluster1 {
    subgraph cluster2 {
    A;
    B;
    C;
    }
    subgraph cluster3 {
    P;
    graph[color=white];
    }
    subgraph cluster4 {
    D;
    E;
    F;
    }
    Z;
}

/* Guide Nodes */
rank1 [style=dotted];
rank2 [style=dotted];

/* Guide Nodes Hierarchy */
rank1 -> rank2 [style=dotted];

/* Node Hierarchy */
A -> Z;
B -> Z;
C -> Z;
P -> Z;
D -> Z;
E -> Z;
F -> Z;

/* Rank Constraints */
rank1 -> A -> B -> C [style=dotted, constraint=false];
D -> E -> F [style=dotted, constraint=false];
P -> C [dir=back, style=dotted, constraint=false];
P -> D [style=dotted, constraint=false];

} /* Closes the digraph */