2

考虑下面的子图,有 5 个 Mrecod 节点:

在此处输入图像描述

有没有办法强制垂直方向,节点彼此上方?我在子图中试过rankdir=TB了,没有效果。

我在没有特殊参数的 Ubuntu 下运行 graphviz:

dot -Tpng graph.dot -o img/graph.png
4

1 回答 1

7

亚当,只是为了澄清几个可能令人困惑的点:

  1. 我很确定该rankdir属性适用于整个图,您无法隔离该特定子图。

  2. rankdir=TB是开始的默认值,所以添加它并不会真正做任何事情。

也就是说,如果我正确阅读了您的子图,它看起来像:

  • 您在一个集群中有 5 个记录类型节点的集合。

  • 这些节点中的每一个都具有来自集群外一个或多个节点的入站边。

  • 集群中的所有节点之间都没有边。

如果这是正确的,那么您的子图中的节点具有相同的rank(或者可能是,取决于连接到它们的节点的等级)。设置rankdir=LR(或rankdir=RL)将改变该子图的方向,使节点垂直对齐,但它也会改变整个图的对齐方式。

让这些节点垂直对齐的一种方法是在它们之间添加一个不可见的边缘例如,如果您有节点 A、B、C、D 和 E,您的集群定义可能如下所示:

digraph G {
   // ...skipping stuff outside the cluster...
   subgraph clusterFoo {
      node [shape=record]
      A [label="..."]
      B [label="..."]
      C [label="..."]
      D [label="..."]
      E [label="..."]
      edge [style=invis]
      A -> B -> C -> D -> E
   }
}

添加边将强制子图中的节点具有不同的等级,因此默认rankdir=TB将节点从上到下而不是从左到右布置。这些“假”边上的style=invis属性将使它们不可见。

如果您想调整集群中节点的间距或对齐方式,您可能还想使用边缘属性(例如/attrs.html#d:minlen),或者考虑weight入站边缘。minlenconstraint=false

如果我误解了您的图表,或者这对您根本没有帮助,您能否更新您的问题以添加您正在使用的 DOT 文件的最小示例?

PS:在 Ubuntu 上,您可以使用:

dot -Txlib graph.dot

在 graph.dot 中快速打开一个带有图形渲染的窗口,而无需先将其写入文件。当您修改源文件时,渲染的图像甚至会自动更新。

于 2014-01-01T18:42:04.207 回答