是否可以使用指定的固定布局在 Graphviz 中定义子图(簇)

Is it possible to define subgraphs (clusters) in Graphviz with a specified, fixed layout

如何在 Graphviz 中创建 subgraphs/clusters 节点位于特定位置,然后让 Graphviz 根据一组互连边(即不在子图中的边)旋转和排列这些子图?

这是我目前的尝试。问题是我希望能够定义节点的内部排序,例如,子图“3”中的节点排成一行(并且始终按 A-B-C 排序):

graph {
    forcelabels=true
    color=lightgrey

    subgraph cluster_1 {
        node[shape=point]  
        {rank=same r1A r1B}
        label="1"
        r1A [xlabel="A", fontsize=7]
        r1B [xlabel="B", fontsize=7]
    }
    subgraph cluster_2 {
        node[shape=point]
        {rank=same r2A r2B}
        label="2"
        r2A [xlabel="A", fontsize=7]
        r2B [xlabel="B", fontsize=7]
    }

    subgraph cluster_3 {
        node[shape=point]
        {rank=same volA volB volC}
        label="3"
        volA [xlabel="A", fontsize=7]
        volB [xlabel="B", fontsize=7]
        volC [xlabel="C", fontsize=7]
    }
}

如果我添加边,我希望 Graphviz 能够旋转子图,但同时保留内部布局和顺序。在这里,使用引擎 fdp,子图“3”全部重新排列(原因很明显,因为我没有任何修复布局的方法):

那么更高级的“布局”呢?是不是possible/feasible做一个类似微控制器的子图,像这样:

  • 不幸的是,none 的 Graphviz 引擎会进行节点旋转。您必须为节点旋转创建一个完整的引擎(架构支持这一点)或一个 pre/post 处理器仅用于节点旋转(稍后)
  • 此外,Graphviz 似乎只支持根图级别的文本旋转。根据您的要求,这可能是一个杀手。
  • 如果你想使用集群(建议:不),你可能需要使用 dot 引擎来排列你的节点。
  • Html-records(可能包含图像)可能是 IC 的“更好”选择。同样,none 个引擎将旋转它们,但是 ...
  • 周期很便宜,所以如果没有“太多”的 IC,生成所有可能性(每个 IC 轮换或不轮换)然后眼球评估或编写 post-processing 程序以确定“最佳”结果.
  • 另请注意,Graphviz 边缘路由可能无法生成您想要的结果。