使用点语言在Graphviz中分层

时间:2013-02-14 16:35:22

标签: data-visualization graphviz dot

我正在处理一个点文件来呈现节点的分层。

我的身材就是这个。 (抱歉,我没有足够的声誉来发布图片..) http://www.flickr.com/photos/40328682@N03/8473003861/in/photostream/lightbox/

但是,我希望树(蓝色节点)不被压缩,并且每棵树只占用一层。我通过添加不可见节点和更多边来绘制示例,如下所示: http://www.flickr.com/photos/40328682@N03/8474093000/in/photostream/lightbox/

我尝试使用$ rank = same $将黄色节点和蓝色节点(前一个)放在同一级别上,但是如果不插入不可见节点,我就无法添加更多层。

有没有办法可以在不添加不可见节点的情况下在不同等级之间添加更多图层?非常感谢!

1 个答案:

答案 0 :(得分:3)

如果子图之间没有连接,则无法控制它们的位置。使用rank=same是左侧图例中的常用方法,以及强制结构进入布局的不可见节点。

如果您只需要在两个节点之间添加最小空间,则可以使用隐藏边缘上的minlen =属性来强制执行所需的分隔。这也在subgraph cluster ranking in dot中解释。

这在以下证明:

digraph {
    node [label = ""];

    A; B; C; D;
    E [style = invis];

    {   node [shape = box, label = ""];

        1 -> 2;
        3 -> { 4; 5; 6; 7; 8; 9; 10; 11; 12; }; 5 -> 13; 7 -> 14; 10 -> 15; 12 -> { 16; 17; }; 16 -> 18;
        19 -> { 34; 35; 36; 37; 38; 39; 40; 41; }; 35 -> 42; 36 -> 43; 40 -> { 45; 46; }; 41 -> 44;
        20 -> { 21; 22; 23};
    }

    {   edge [weight = 10];
        A -> B [minlen = 2];
        B -> C [minlen = 3];
        C -> D [minlen = 3];
        D -> E [style = invis];
    }

    {   rank = same; A -> 1; }
    {   rank = same; B -> 3; }
    {   rank = same; C -> 19; }
    {   rank = same; D -> 20; }
}

最后一棵树(从D引用)将落在左边的椭圆下,没有隐藏的E。如果这是不可接受的,那么上面树中一个节点的隐藏边缘需要连接到节点20

可以使用minlen =属性调整省略号之间的间距。