graphviz具有直角的宽扁树结构

时间:2018-10-02 04:09:36

标签: graph tree graphviz pygraphviz

我有一个树的怪兽,我试图使用点在graphviz中可视化。具体来说,我想使用具有共享边的正交分支,因为我的某些节点的出度为〜20(最大值,大多数接近3-5)。

我想要的是这样的东西(原谅可怕的油漆工作):

desired

我已经读了很多有关使用隐藏节点来获取它并获得此代码的书

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
}

但是我得到的是:

broken

此方法对大约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"]
}

kinda_broken

在这种情况下,我有N = 8个节点,高度为 h ,间隔为 s ,因此我将框(N-1)*(h+s)的高度覆盖到框顶部和底部的中间位置,但由于无法完全控制尾点,所以我悬了一下。不确定这会扩展到更大的树

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

1 个答案:

答案 0 :(得分:2)

好吧,经过一番混乱之后,我想出了一个可行的解决方案。使用“正交”,“线”或“折线”作为样条线方法,可以按如下方式创建一个(不可见的)“关节”节点 per 输出状态:

 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
}

哪个产生这个:

kind of working

这种比例缩放到较大的图,看起来还不错(我发现折线是较大树的最佳样条方法)。主要烦人的部分是,您必须确定指向“ A”的关节(它不能只是一般地指向直线上的某个地方或直线的中间)。大树可能会让人头疼