Graphviz:控制节点在子图中对齐

时间:2013-12-30 16:36:12

标签: orientation nodes graphviz subgraph

考虑以下子图,包含5个Mrecod节点:

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:5)

亚当,只是为了澄清一些可能令人困惑的问题:

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

  2. rankdir=TB是默认值,因此添加它实际上不会做任何事情。

  3. 那就是说,如果我正确地读你的子图,它看起来像是:

    • 群集中有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属性会使它们不可见。

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

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

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

    dot -Txlib graph.dot
    

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