【问题标题】:graphviz wide flat tree structure with right anglesgraphviz 直角宽扁树结构
【发布时间】:2018-10-02 04:09:35
【问题描述】:

我有一个树的怪物,我正在尝试使用 dot 在 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:正如预期的那样,这在更复杂的图表上根本不起作用,因为我无法知道右侧的框将相隔多远(它们被隔开以便为其他节点腾出空间)

【问题讨论】:

    标签: graph tree graphviz pygraphviz


    【解决方案1】:

    好的,经过一番折腾,我想出了一个可行的解决方案。使用“ortho”、“lines”或“polyline”作为样条方法,可以创建一个(不可见的)“joint”节点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
    }
    

    产生这个:

    这种缩放到更大的图形并且看起来不错(我发现折线是较大树的最佳样条方法)。主要烦人的部分是你必须决定将“A”指向哪个关节(它不能只是一般地指向线上的某个地方,或者线的中间)。这可能会给较大的树带来一些麻烦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2021-08-21
      相关资源
      最近更新 更多