Graphviz-叶节点的垂直顺序

时间:2018-08-21 14:49:24

标签: graphviz dot

我正尝试生成一个树形图(从左到右),以说明对象引用树。 除此之外,我希望叶子垂直出现,因为这表明执行的顺序。

点代码如下:

digraph G {

    rankdir=LR
    subgraph cluster_0 {

        L1   L2   L3   L4  L5  L6 
        L10  L20  L30   L40  L50  L60

        { rank=same;
            L1 -> L2 -> L3 ->  L4 -> L5 -> L6 ->
            L10 -> L20 -> L30 ->  L40 -> L50 -> L60 
        }
    }

    subgraph cluster_1 {
        R

        D10 D11

        D20 D21 D22 D23

        D30 D31 D32 D33 D34 D35 D36 D37
    }

    R->D10
    R->D11

    D10 -> D20
    D10 -> D21
    D11 -> D22
    D11 -> D23

    D20 -> D30
    D20 -> D31
    D21 -> D32
    D21 -> D33
    D22 -> D34
    D22 -> D35
    D23 -> D36
    D23 -> D37

    D30 -> L1
    D20 -> L2
    D31 -> L3

    D32 -> L4
    D21 -> L5
    D33 -> L6

    D34 -> L10
    D22 -> L20
    D35 -> L30

    D36 -> L40
    D23 -> L50
    D37 -> L60
}

我的研究成果(使用https://dreampuf.github.io/GraphvizOnline/渲染SVG): Tree

问题是,我希望叶子按声明的顺序显示。 在SO上的一些帖子之后,我一直在研究约束/隐形边缘/排名系统 但不能完全动手。

如果一些图形蜥蜴可以伸出他们的手,那就太好了。 请注意,此过程稍后将通过python自动执行,因此,一些可靠的想法将不胜感激。

注释2,该树最多可以有数百个叶子。

注释3,如果您知道一些不错的python lib来生成Graphs(至少对您来说)比Graphviz直观,请发表评论。我目前正在使用 pydot&graphviz(py3)

1 个答案:

答案 0 :(得分:1)

通过将叶节点移出并为其添加权重,我可以做到以下几点:

enter image description here

我将点输入更改为:

digraph G {
    rankdir=LR
    subgraph cluster_0 {
        L1   L2   L3   L4  L5  L6 
        L10  L20  L30   L40  L50  L60
    }

    subgraph cluster_1 {
        R
        D10 D11
        D20 D21 D22 D23
        D30 D31 D32 D33 D34 D35 D36 D37
    }

    R->D10 
    R->D11 

    D10 -> D20 
    D10 -> D21 
    D11 -> D22 
    D11 -> D23 

    D20 -> D30 
    D20 -> D31 
    D21 -> D32 
    D21 -> D33 
    D22 -> D34 
    D22 -> D35 
    D23 -> D36 
    D23 -> D37 

    D30 -> L1 
    D20 -> L2 
    D31 -> L3 

    D32 -> L4 
    D21 -> L5 
    D33 -> L6 

    D34 -> L10 
    D22 -> L20 
    D35 -> L30 

    D36 -> L40 
    D23 -> L50 
    D37 -> L60 

    { rank=same;
      L1-> L2 [style=invis, weight=1000]
      L2-> L3 [style=invis, weight=1100]
      L3-> L4 [style=invis, weight=1200]
      L4-> L5 [style=invis, weight=1300]
      L5-> L6 [style=invis, weight=1400]
      L6-> L10 [style=invis, weight=1500]
      L10-> L20 [style=invis, weight=1600]
      L20-> L30 [style=invis, weight=1700]
      L30-> L40 [style=invis, weight=1800]
      L40-> L50 [style=invis, weight=1900]
      L50-> L60 [style=invis, weight=2000]
    }
}