如何使表示二叉树的点图更对称?

时间:2014-05-02 13:41:14

标签: layout graphviz

在尝试使用Graphviz为二叉树创建图形时,我遇到了很多次问题;显然,使用足够高的树和足够大的nodesep,得到的图形往往不是对称的。例如,这里是一个点源

digraph G {
    nodesep=0.8;
    ranksep=0.5;

    {node[style=invis,label=""]; cx_30;
    }

    {rank=same; 20; 45; cx_30}
    {rank=same; 10; 25;}
    {rank=same; 40; 50}

    30 -> 20;
    30 -> 45;
    20 -> 10;
    20 -> 25;

    45 -> 40;
    45 -> 50;

    {edge[style=invis];
                        //Distantiate nodes
                        30 -> cx_30;
                            20 -> cx_30 -> 45;

                        //Force ordering between childs
                        10:e -> 25:w;
                        40:e -> 50:w;
    } 
} 

带有相应的输出(用dot -Tpng file.dot > file.png编译) dot tree result

如您所见,45并未置于4050之间的中间位置。我可以使用4050之间的不可见节点来纠正这种情况,但结果间距会太宽。

我做错了吗?有没有办法纠正这种情况?

1 个答案:

答案 0 :(得分:2)

尽管它并没有直接为我工作,但我还是通过了Tom Ron的建议,看看this answer关于二元树的问题;提供的脚本对我不起作用,但faq entry链接帮助我解决问题;我不想为间距原因添加一个invisibile节点,但为不可见节点指定正确的width属性并缩放nodesep因此工作得很好。

以下是更正的来源:

digraph G {
    nodesep=0.4; //was 0.8
    ranksep=0.5;

    {node[style=invis,label=""]; cx_30;
    }
    {node[style=invis, label="", width=.1]; ocx_45; ocx_20;
    }

    {rank=same; 20; 45; cx_30}
    {rank=same; 10; 25; ocx_20}
    {rank=same; 40; 50; ocx_45}

    30 -> 20;
    30 -> 45;
    20 -> 10;
    20 -> 25;

    45 -> 40;
    45 -> 50;

    {edge[style=invis];
                        //Distantiate nodes
                        30 -> cx_30;
                            20 -> cx_30 -> 45;

                        //Force ordering between children
                        45 -> ocx_45;
                            40 -> ocx_45 -> 50;
                        20 -> ocx_20;
                            10 -> ocx_20 -> 25;
    } 
} 

使用相应的输出dot tree output