graphviz直角宽扁树结构

graphviz直角宽扁树结构,graph,tree,graphviz,pygraphviz,Graph,Tree,Graphviz,Pygraphviz,我有一棵树的怪物,我正试图用圆点在graphviz中形象化。具体来说,我希望使用具有共享边的正交分支,因为我的一些节点的向外度为~20(最大值,大多数接近3-5) 我想要的是这样的东西(请原谅糟糕的油漆工作): 我已经读了很多关于使用隐藏节点来获取这些信息的书,并且有了这些代码 digraph { splines="ortho" rankdir="LR" concentrate="true" aa [shape=none, label="", width=0,

我有一棵树的怪物,我正试图用圆点在graphviz中形象化。具体来说,我希望使用具有共享边的正交分支,因为我的一些节点的向外度为~20(最大值,大多数接近3-5)

我想要的是这样的东西(请原谅糟糕的油漆工作):

我已经读了很多关于使用隐藏节点来获取这些信息的书,并且有了这些代码

digraph {
    splines="ortho"
    rankdir="LR"
    concentrate="true"
    aa [shape=none, label="", width=0, height=0]
    A
    B
    C
    D
    E
    F
    G
    H
    I
    A -> aa [arrowhead="none"]
    aa -> B
    aa -> C
    aa -> D
    aa -> E
    aa -> F
    aa -> G
    aa -> H
    aa -> I
}
但我得到的是:

这种方法适用于3个左右的子节点,但在更大的用例中会立即失效。打开或关闭“专注”都不会有太大影响(非常轻微的改善)

我目前的计划是放弃这种方法,尝试使用“记录”样式的节点并手动将它们堆叠起来,但这将是一个更大的工作,所以我希望其他人有更好的建议。我对它的外观有点灵活,基本上我只想把一棵有600个节点的树想象成这样一个巨大的图像

我实际上是从python生成的,以防有什么不同(如果有帮助的话,我愿意使用另一个python库)

编辑:我发现的一个痛苦的技巧是使用一个0宽度和Y高度的框,而不是单点隐藏节点,问题是你不得不对间距大惊小怪,它仍然不太正确。这就是我目前所知道的,但我希望有人有更好的想法:

digraph {
    splines="ortho"
    rankdir="LR"
    nodesep=0.3
    aa [shape=box, label="", width=0, height=5.6]
    node [shape=box, height=0.5]
    A
    B
    C
    D
    E
    F
    G
    H
    I
    A -> aa [arrowhead="none"]
    aa -> B [headport="w"]
    aa -> C [headport="w"]
    aa -> D [headport="w"]
    aa -> E [headport="w"]
    aa -> F [headport="w"]
    aa -> G [headport="w"]
    aa -> H [headport="w"]
    aa -> I [headport="w"]
}

在本例中,我有N=8个节点,高度为h,间距为s,因此我将框的高度
(N-1)*(h+s)
覆盖到顶部和底部框的中间,但我最终会出现悬垂,因为我无法完全正确控制尾端。不确定这将如何扩展到一棵更大的树


编辑2:正如预期的那样,这在更复杂的图形上根本不起作用,因为我无法知道右侧的框之间的距离(它们被隔开,以便为其他节点腾出空间)

好的,经过一点混乱,我想出了一个可行的解决方案。使用“正交”、“直线”或“多段线”作为样条线方法,可以为每个传出状态创建一个(不可见的)“关节”节点,如下所示:

 digraph {
    splines="ortho"
    rankdir="LR"

    node [shape=box]
    A B C D E F G H I

    node [shape=none, label="", width=0.0, height=0.0]
    {
        rank=same;
        bb->cc->dd->ee->ff->gg->hh->ii [arrowhead="none"]
    }

    A->bb [arrowhead="none"]

    bb -> B
    cc -> C
    dd -> D
    ee -> E
    ff -> F
    gg -> G
    hh -> H
    ii -> I
}
这就产生了:

这种方法可以扩展到更大的图形,看起来还不错(我发现对于更大的树来说,多段线是最好的样条线方法)。最让人恼火的是,你必须决定“A”指向哪个关节(它不能一般地指向直线上的某个地方,或直线的中间)。这会给大树带来一些麻烦