【问题标题】:Graphviz - Vertical order of leaf nodesGraphviz - 叶节点的垂直顺序
【发布时间】:2019-01-27 19:12:09
【问题描述】:

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

点代码如下:

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):

问题是,我希望叶子按照声明的顺序出现。 在 SO 上的一些帖子之后,我一直在玩约束/不可见边缘/排名系统 但我无法完全掌握它。

如果有图形浏览器能把他们的手伸到这里就好了。 请注意,此过程稍后将使用 python 自动执行,因此将不胜感激一些强大的想法。

注 2,这棵树可能有多达数百片叶子。

注意 3,如果您知道一些好的 python 库来生成比 Graphviz 更直观(至少对您而言)的图形,请发表评论。我目前正在使用 pydot & graphviz (py3)

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

    通过将叶节点移出并向它们添加权重,我得到以下结果:

    我将点输入改为:

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

    【讨论】:

    • 嗨,我先说这解决了我的大部分问题!其次,我想再问 2 个问题: 1. 为什么在调整等级后第一个集群周围的正方形消失了 2. 是您建议的任何经验法则,以防我想对我的树中的每个深度进行排序顺序,用于分配边缘权重?
    • 当我在子图 cluster_0 中有该部分时,权重似乎不适用。在我把它搬出去之后,他们工作了,但是你把盒子弄丢了。 RE:重量,我把它们做成了一千多个,以确保它们在绘图顺序中占主导地位。你只需要确保他们优先。见graphviz.org/doc/info/attrs.html#d:weight
    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2014-08-02
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多