【问题标题】:graphviz Tree Layoutgraphviz 树布局
【发布时间】:2010-08-27 08:21:49
【问题描述】:

我是第一次使用 graphviz。我只需要一个树形布局,以便所有子级都处于同一级别。

例如, A->B A->C A->D

那么 B、C 和 D 应该处于同一级别。

以下是我正在使用的代码。

digraph unix {
    size="6,6";
    node [color=lightblue2, style=filled];

    "A:1000" -> "B:300";
    "A:1000" -> "C:300";
    "A:1000" -> "D:200";
    "B:300" -> "E:140";
    "B:300" -> "F:164";
    "B:300" -> "G:75";
    "C:300" -> "H:135";
    "C:300" -> "I:91";
    "D:200" -> "E:140";
    "D:200" -> "F:164";
    "D:200" -> "G:75";
    "E:140" -> "F:164";
    "E:140" -> "G:75";
    "F:164" -> "G:75";
    "G:75" -> "H:135";
    "H:135" -> "I:91";
}

如何确保孩子处于同一水平?

【问题讨论】:

  • 和使图表看起来很酷的提示会很棒。我要把它介绍给我的朋友。

标签: graphviz


【解决方案1】:

要使节点处于同一级别,例如“B:300”和“C:300”,请添加以下行:

{rank=same; "B:300" "C:300"}

【讨论】:

  • 谢谢 ars 但是如果我必须动态生成图形,我将不知道哪些节点是兄弟姐妹仪式。我在想,如果你写,A->B,A->C,A->D .. graphviz 会看到 B、C 和 D 来自相同的节点,因此需要处于同一级别。
  • 如果您动态生成它,添加rank 行可能更简单,因为您可以确定程序中的子节点。
【解决方案2】:

您提供的图不代表树,而是有向无环图(在树中,每对节点之间只有一条不同的路径)。如果您的输入是一棵树,那么只需使用dot 就会产生您想要的结果。如果您还想添加非树边缘,例如您的示例中的"C:300" -> "H:135",您可以为它们指定较低的权重,以确保dot 不会尝试针对这些边缘优化布局。

"C:300" -> "H:135" [weight=0];
"C:300" -> "I:91" [weight=0];

请注意,使用此设置,这两条边会变得很长(并且到 dot,很难看),这就是为什么节点 "C:300" 被放置在原始图中的原因。

【讨论】:

  • 简而言之:这不是一棵树,因为 C => H => I 也是 C => I
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2018-08-09
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多