【问题标题】:Preventing graphviz from rearranging nodes防止graphviz重新排列节点
【发布时间】:2012-02-28 09:17:12
【问题描述】:

我正在尝试使用 graphviz 可视化树结构,问题是随着图变大,graphviz 开始重新排列节点的顺序。假设我有以下,

  A
/ | \
B C D

变成了,

  A
/ | \
B D C

这样做可能是为了节省空间,但在我尝试添加的节点的上下文顺序中,

graph [ordering="out"];

但它并没有改变输出。

编辑:

digraph bt {
graph [ordering="out"];
node [style="rounded", shape=box]
N_2386 -> N_2387
N_2387 -> N_2388
N_2388 -> N_2389
N_2388 -> N_2390
N_2387 -> N_2391
N_2386 -> N_2392
subgraph cluster_2393 {
labeljust = "l";
style=dashed;color="#B0B0B0"
N_2392 -> N_2394
N_2394 -> N_2395
N_2395 -> N_2396
N_2396 -> N_2397
N_2397 -> N_2398
N_2397 -> N_2399
N_2396 -> N_2400
N_2400 -> N_2401
N_2400 -> N_2402
N_2395 -> N_2403
N_2403 -> N_2404
N_2404 -> N_2405
N_2405 -> N_2406
N_2403 -> N_2407
N_2407 -> N_2408
N_2408 -> N_2409
N_2409 -> N_2410
N_2410 -> N_2411
N_2411 -> N_2412
N_2412 -> N_2413
N_2412 -> N_2414
N_2412 -> N_2415
N_2411 -> N_2416
N_2416 -> N_2417
N_2416 -> N_2418
N_2416 -> N_2419
N_2408 -> N_2420
N_2408 -> N_2421
N_2403 -> N_2422
N_2395 -> N_2423
N_2392 -> N_2424
}
}

有问题的图表我需要的是,N_2387 应该在右边 N_2392 应该在左边。我插入它们的顺序是什么。

【问题讨论】:

  • 你有没有偶然解决过这个问题?不幸的是,我遇到了同样的问题。

标签: graphviz


【解决方案1】:

我尝试了以下

digraph g {
  ordering=out ;
  node [shape=box] ;

  a -> b ;  a -> c ;  a -> d ;  a -> e ;  a -> f ;
  a -> g ;  a -> h ;  a -> i ;  a -> j ;  a -> k ;
  a -> l ;  a -> m ;  a -> n ;  a -> o ;  a -> p ;
  a -> q ;  a -> r ;  a -> s ;  a -> t ;  a -> u ;
  a -> v ;  a -> w ;  a -> x ;  a -> y ;  a -> z ;
}

并且所有节点b-z 都以正确的顺序位于同一级别。 你用的是什么版本?

【讨论】:

  • 我已经更新到最新发生的相同情况我已将相关图表添加到问题中。
【解决方案2】:

如果您想控制特定项目的排序,请在它们之间使用不可见的边缘。将它与 rank 指令结合使用可以让您拥有很多控制权。

例如:这是来自 Graphviz 的示例 tagcloud 布局:

/*
Using a graph and relationships just to push things onto different lines.
Two layout rules:
1) all items on a given line go into a "rank=same" phrase 
2) a relationship is needed between the first word on each line and the next line down to
   force the vertical alignment.
*/
digraph {
    edge[style=invisible]
    node[shape=none]

    fred [fontsize=18]
    harry [fontsize=8]
    jack [fontsize=12]
    sally [fontsize=12]
    mika
    amy
    jan
    jack -> fred
    fred -> mika
    {rank=same;fred;harry}
    {rank=same;mika amy; jan}
}

【讨论】:

    【解决方案3】:

    如果您将第一个分支更改为子图,则两个子图将按照文件中写入的顺序排列。

    似乎子图作为普通节点具有更高的优先级,因此ordering=out 似乎不受尊重。

    这行得通:

    digraph bt {
      graph [ordering="out"];
      node [style="rounded", shape=box]
      N_2386 -> N_2387
      subgraph cluster_first {
        N_2387 -> N_2388
        N_2388 -> N_2389
        N_2388 -> N_2390
        N_2387 -> N_2391
      }
      N_2386 -> N_2392
      subgraph cluster_2393 {
        labeljust = "l";
        style=dashed;color="#B0B0B0"
        N_2392 -> N_2394
        N_2394 -> N_2395
        N_2395 -> N_2396
        N_2396 -> N_2397
        N_2397 -> N_2398
        N_2397 -> N_2399
        N_2396 -> N_2400
        N_2400 -> N_2401
        N_2400 -> N_2402
        N_2395 -> N_2403
        N_2403 -> N_2404
        N_2404 -> N_2405
        N_2405 -> N_2406
        N_2403 -> N_2407
        N_2407 -> N_2408
        N_2408 -> N_2409
        N_2409 -> N_2410
        N_2410 -> N_2411
        N_2411 -> N_2412
        N_2412 -> N_2413
        N_2412 -> N_2414
        N_2412 -> N_2415
        N_2411 -> N_2416
        N_2416 -> N_2417
        N_2416 -> N_2418
        N_2416 -> N_2419
        N_2408 -> N_2420
        N_2408 -> N_2421
        N_2403 -> N_2422
        N_2395 -> N_2423
        N_2392 -> N_2424
      }
    }
    

    【讨论】:

    • 问题是我正在以编程方式生成这些图表,我事先不知道它会是什么样子。
    【解决方案4】:

    Graphviz 旨在生成具有令人愉悦外观的图形。试图强制布局会破坏该工具的大部分价值。

    如前所述,不可见的边缘可用于强制执行某些布局,并且字典顺序(较早的节点倾向于放置在更左侧)也可以表示偏好。

    一般来说,向布局添加更多约束会产生非常难以排除故障的不正常布局。

    与预期布局的一些偏差不应自动导致尝试强制结果。更少的约束使得生成的图表随着时间的推移而变化时保持美观,即使它们的外观可能发生根本性的变化。

    【讨论】:

    • 有时要求节点按特定顺序排列。
    • @Josh 我使用该工具的大部分困难都来自于尝试强制布局。虽然更简单的工具可以提供更具体的控制,但 Graphviz 中丰富的布局模型使大多数布局恰到好处,但非常具体的排序很困难,而且尝试往往适得其反。我确实指出了两种方法(通过其他答案更详细地解释)有时可以提供预期的顺序,并说明了为什么这通常是不可能的。自动布局对于频繁更改的大型图表至关重要,我发现调整它们的努力通常是不值得的。
    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2013-01-15
    • 2013-03-21
    • 2014-10-09
    相关资源
    最近更新 更多