13

我已经为此苦苦挣扎了一段时间,似乎找不到直接的答案。我正在使用 graphviz 中的复合子图,似乎找不到正确的设置组合来强制两个子图相互对齐。

附上一个简单的例子来说明问题......

digraph g {
  compound=true;

  subgraph cluster_top {
    graph [color=black, label="Top", rank=min];

    nodeA; nodeB; nodeC
    cluster_top_DUMMY [shape=point style=invis]
  }

  subgraph cluster_service {
    graph [color=black, label="Bottom", rank=min];
    node1; node2; node3; node4; node5; extra_long_node
    cluster_bottom_DUMMY [shape=point style=invis]
  }
  cluster_top_DUMMY -> cluster_bottom_DUMMY [ style=invis ]
}

这会生成底部子图比顶部子图宽得多的输出。

在此处输入图像描述

我真正想要的是确保顶部和底部的宽度始终完全相同。此外,如果有太多节点无法适应可用宽度,则会生成额外的节点行。

4

1 回答 1

3

一个可能的(糟糕但有效的)解决方案是使用不可见的节点并设置宽度。考虑以下:

digraph g {
  compound=true;

    subgraph cluster_top {
      graph [color=black, label="Top", rank=min];

      nodeAI0 [style=invisible]
      nodeAI1 [style=invisible]
      nodeAI2 [style=invisible,fixedsize=true,width=1.65]
      nodeA; nodeB; nodeC
      cluster_top_DUMMY [shape=point style=invis]
    }

    subgraph cluster_service {
      graph [color=black, label="Bottom", rank=min];
      node1; node2; node3; node4; node5; extra_long_node
      cluster_bottom_DUMMY [shape=point style=invis]
    }
    cluster_top_DUMMY -> cluster_bottom_DUMMY [ style=invis ]
}

在此处输入图像描述

不可见节点(NodeAI0-NodeAI2)占据空间。fixedsize=true,width=1.65 使最后一个正好为 1.65 英寸。

另一个更好的解决方案是通过添加以下内容来专门设置相关的较长节点(以避免必须寻找正确的值):

  node [fixedsize=true,width=0.75]

在 Compound=true 部分之后。

于 2013-03-28T09:48:56.560 回答