如何定义GraphViz中集群的排序顺序?

3
我写了一个脚本来动态生成包含一些集群的Graphviz图形。我想定义集群的排序顺序,因为当我可视化图形时,集群不总是按照我定义的顺序排列。
我尝试使用"packmode"和"sortv"属性,但可能我没有正确理解它们的用法。这里有一个简单的例子,我希望将集群B放在左边,集群A放在右边:
digraph G {

    pack=true;
    packmode="array_u";

subgraph cluster_A {
    sortv=2;

    node [label="A1"] A1;
    node [label="A2"] A2;
    node [label="A3"] A3;

    A1->A2;
    A1->A3;
}

subgraph cluster_B {
    sortv=1;

    node [label="B1"] B1;
    node [label="B2"] B2;
    node [label="B3"] B3;

    B1->B2;
    B1->B3;
}

B1->A1 [constraint="false"];
}

我该如何解决这个问题?提前感谢!

1个回答

2

虽然不是完美的解决方案,但如果你在群集B和群集A之间画一条无形的边缘,它会将群集B放置在群集A的前面,但略高一些:

digraph G {

    pack=true;
    packmode="array_u";

    compound = "true";

subgraph cluster_A {
    sortv=2;

    node [label="A1"] A1;
    node [label="A2"] A2;
    node [label="A3"] A3;

    A1->A2;
    A1->A3;
}

subgraph cluster_B {
    sortv=1;

    node [label="B1"] B1;
    node [label="B2"] B2;
    node [label="B3"] B3;

    B1->B2;
    B1->B3;
}

B1->A1 [constraint="false"];

B1 -> A1
[
    ltail = "cluster_B"
    lhead = "cluster_A"
    style = "invis"
]

}

只需添加compound=true指令和不可见的边缘即可。

如果你不使用pack=true选项,你可以使用newrank=true然后{rank=same; A1 B1}。它们将会被放置在一起。 - Jens Munk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接