【发布时间】: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