Graph 在点图中,如何移动簇并防止线不必要地交叉?

Graph 在点图中,如何移动簇并防止线不必要地交叉?,graph,graphviz,dot,Graph,Graphviz,Dot,我正在使用Graphviz生成此图: 输出不是最优的。XZ线不必要地与XY线交叉;我希望Y高于X。我从doco尝试了许多选项,但都没有用。这就是我所期望的输出: 如何让Graphviz生成更好的优化图 注意:我想自动生成类似的图表,因此针对上述场景的解决方案(例如,X0->Y1、Y11->X03或其他场景中的不可见边)不会有帮助。我正在寻找一种能够普遍信任的方式,比如: A-X-B将是一条直线 如果Y不与Z交互,则Y将位于A-X-B之上 X->Y->X不会不必要地造成X节点之间的大间隙

我正在使用Graphviz生成此图:

输出不是最优的。XZ线不必要地与XY线交叉;我希望Y高于X。我从doco尝试了许多选项,但都没有用。这就是我所期望的输出:

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

注意:我想自动生成类似的图表,因此针对上述场景的解决方案(例如,X0->Y1、Y11->X03或其他场景中的不可见边)不会有帮助。我正在寻找一种能够普遍信任的方式,比如:

  • A-X-B将是一条直线
  • 如果Y不与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
}

这是不平凡的。我们欢迎志愿者帮助设计算法。埃姆登·甘斯纳(Emden Gansner)和我对dot进行了一次彻底的改革(对子图和长边使用更干净的数据结构,对mincross使用筛选),但我们没有完成。我们编写了新的级别分配cpde,我认为Emden重新侵入了旧的点布局引擎。如果有人想把它捡起来并进一步发展,可能需要几个月的努力。请通过graphviz.org与我们联系

一般来说,约束机器(如dot)可能有点脆弱。要么他们自己得到正确的解决方案,要么你可以添加一些调整,但只要输入发生一点变化,这些调整就会破坏一切,这是不好的。由于布局过程的连续性,例如,很难采用不同的级别分配来减少以后的交叉。如果有人想查找并实现它,在图形绘制会议上可能会有一些工作


斯蒂芬·诺斯

谢谢斯蒂芬。继续努力,Graphviz是一个出色的工具。