【问题标题】:Graphviz: Control node align in a subgraphGraphviz:控制节点在子图中对齐
【发布时间】:2013-12-30 16:36:11
【问题描述】:

考虑以下具有 5 个 Mrecod 节点的子图:

有没有办法强制垂直方向,节点相互重叠?我在子图中尝试了rankdir=TB,但没有效果。

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

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

【问题讨论】:

    标签: orientation nodes graphviz subgraph


    【解决方案1】:

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

    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 属性将使它们不可见。

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

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

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

    dot -Txlib graph.dot
    

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

    【讨论】:

    • dot -Txlib 技巧也适用于安装了 X11/XQuartz 的 Mac OS X/macOS。
    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2013-05-13
    • 2018-05-16
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多