在尝试使用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
编译)
如您所见,45
并未置于40
和50
之间的中间位置。我可以使用40
和50
之间的不可见节点来纠正这种情况,但结果间距会太宽。
我做错了吗?有没有办法纠正这种情况?
答案 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;
}
}
使用相应的输出