在DOT图中,如何移动集群并防止线路不必要地交叉?

时间:2013-08-17 06:35:54

标签: graph graphviz dot

我正在使用Graphviz生成此图表: What I'm getting

输出不是最佳的。 XZ线不必要地穿过XY线;我希望Y高于X.我已尝试过doco的许多选项,但无济于事。这是我期待的那种输出: What I want

如何让Graphviz生成更好的优化图表?

注意:我想自动生成类似的图表,因此特定于上述场景的解决方案(例如,来自X0的隐形边缘 - > Y1,Y11 - > X03或诸如此类别)将无济于事。我正在寻找一种能够普遍信任的方式:

  • A-X-B将是一条直线。
  • 如果不与Z相互作用,Y将高于A-X-B。
  • X-> Y-> X不会在X节点之间不必要地造成大的间隙。

点文件内容为:

digraph G {
  rankdir=LR

  subgraph cluster_x {
    node [style=filled,color=green]
    "X.0" -> "X.0.1" -> "X.0.2" -> "X.0.3" -> "X.0.4"
  }

  subgraph cluster_y {
    node [style=filled,color=lightblue]
    "Y.1" -> "Y.1.1"
  }

  subgraph cluster_z {
    node [style=filled,color=crimson]
    "Z.1" -> "Z.1.1"
    "Z.2"
  }

  A -> "X.0"
  "X.0.1" -> "Y.1"
  "X.0.1" -> "Z.2"
  "X.0.2" -> "Z.1"
  "Y.1.1" -> "X.0.2"
  "Z.1.1" -> "X.0.4"
  "Z.2" -> "Z.1.1"
  "X.0.4" -> B
}

1 个答案:

答案 0 :(得分:1)

这是非常重要的。我们欢迎志愿者帮助布局算法。 Emden Gansner和我在完全彻底检查dot(使用更清晰的子图和长边数据结构,并使用筛分mincross)方面取得了一个重大开端,但我们没有完成。我们写了一个新的关卡分配cpde,我认为Emden回溯到旧点布局引擎。如果有人想要接受它并进一步采取行动,可能需要几个月的努力。请通过graphviz.org与我们联系

一般来说,约束机器(如dot)可能有点脆弱。要么他们自己得到正确的解决方案,要么你可以添加一些调整,但一旦输入变化甚至一点点,调整就会破坏一切,这是不好的。由于布局过程的串行性质,很难例如支持不同的级别分配以便稍后减少交叉。如果有人想要查找并实现它,可能会在Graph Drawing会议中有一些工作。

Stephen North