graphviz树中的子级顺序

graphviz树中的子级顺序,graphviz,dot,Graphviz,Dot,我有以下几棵树: digraph G { subgraph cluster0{ 37[label="+"]; 42[label="a"]; 44[label="b"]; 47[label="*"]; 46[label="c"]; 49[label="d"]; 51[label="e"]; 53[label="f"]; 55[label="g"];

我有以下几棵树:

digraph G {
    subgraph cluster0{
        37[label="+"];
        42[label="a"];
        44[label="b"];
        47[label="*"];
        46[label="c"];
        49[label="d"];
        51[label="e"];
        53[label="f"];
        55[label="g"];
        57[label="h"];
        61[label="*"];
        60[label="i"];
        63[label="j"];
        37 -> 42[label="c"];
        37 -> 44[label="c"];
        37 -> 47[label="c"];
        37 -> 61[label="c"];
        42 -> 37[label="p"];
        44 -> 37[label="p"];
        47 -> 37[label="p"];
        47 -> 46[label="c"];
        47 -> 49[label="c"];
        47 -> 51[label="c"];
        47 -> 53[label="c"];
        47 -> 55[label="c"];
        47 -> 57[label="c"];
        46 -> 47[label="p"];
        49 -> 47[label="p"];
        51 -> 47[label="p"];
        53 -> 47[label="p"];
        55 -> 47[label="p"];
        57 -> 47[label="p"];
        61 -> 37[label="p"];
        61 -> 60[label="c"];
        61 -> 63[label="c"];
        60 -> 61[label="p"];
        63 -> 61[label="p"];
    }
}
输出如下:

第一个
*
子树中的子元素的顺序是:
G H C D E F
,但它应该是
C D E F G H
。 我注意到如果我删除
子图cluster0{
顺序是正确的,但我不能这样做。
您能推荐其他解决方案吗?

Graphviz在没有其他约束的情况下尝试保留节点的词法顺序。但是,边缘标签可能会影响放置,因为它们会占用空间并推动节点

如果你有一个非常重要的特定顺序,那就试试下面的方法

{ rank = same; 
46 -> 49 -> 51 -> 53 -> 55 -> 57 [style = invis];
}
在图中引入额外的排序约束

不过,您需要小心,因为它会以非常难以预测的方式扭曲更复杂的图形


集群进一步使大型图中的问题复杂化,因为它们隐式地试图使子图更紧凑,并引入非集群成员无法跨越的边界框。

我不知道这是否是解决这个问题的一种预期方法,但它对我的中等复杂的图来说是一种魅力。因为我不认为graphviz有“真正的”解决这个问题,我很高兴你的解决办法。。。