图形可视化工具Graphviz中的子节点排序问题

4

我有以下树形结构:

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"];
    }
}

输出结果在这里:http://i.imgur.com/q1qXkCT.png

第一个*子树中的节点顺序是:G H C D E F,但应该是C D E F G H。 我注意到如果删除subgraph cluster0{,则顺序正确,但我无法这样做。 您能建议其他解决方案吗?

1个回答

2

Graphviz试图在没有其他约束的情况下保留节点的词法顺序。然而,边缘标签可能会影响布局,因为它们占用空间并可以推动节点。

如果您有一个必要的特定顺序,请尝试类似以下的方法:

{ rank = same; 
46 -> 49 -> 51 -> 53 -> 55 -> 57 [style = invis];
}

将额外的排序约束引入图中。

但您需要小心,因为它可能以非常难以预测的方式扭曲更复杂的图形。

在较大的图形中,群集进一步复杂了问题,因为它们会隐含地尝试使子图更加紧凑,并引入一个边界框,非群集成员不能越过。


我不确定这是解决此问题的预期方法,但是在我的相对复杂的图形中它非常有效。由于我认为graphviz没有一个“真正”的解决方案,所以我很满意您的解决办法... - Duke

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