子图和簇中 "rank=same" 的问题

Problem with "rank=same" in subgraphs and clusters

从 "normal" 子图切换到集群时,rank=same 似乎不再起作用。

为了说明我的问题,请看下面的示例图。

digraph INV_X1 {
    rankdir = "LR";
    edge [penwidth="2"];

/* Component styles */
    M_i_0 [shape=none;image="res/nmos.jpg"];
    M_i_1 [shape=none;image="res/pmos.jpg"];

/* Node styles */
    A [style=filled;color=green];
    ZN [style=filled;color=green];

/* Connections */
    M_i_0:n -> ZN;
    A -> M_i_0:w;
    /* Put M_i_0 and _VSS_0 on the same rank. */
    subgraph g_VSS_0 {
        rank=same;
        label="_VSS_0";
        _VSS_0 [shape=none;image="res/gnd.jpg";label=""];
        M_i_0 -> _VSS_0 [arrowhead=none];
    }
    M_i_1:s -> ZN;
    A -> M_i_1:w;
    /* Put M_i_1 and _VDD_1 on the same rank. */
    subgraph g_VDD_1 {
        rank=same;
        label="_VDD_1";
        _VDD_1 [shape=none;image="res/pwr.jpg";label=""];
        _VDD_1 -> M_i_1 [arrowhead=none];
    }
}

输出如下图所示。我希望它不会太混乱,因为我为节点使用了一些图像。我创建了两个子图,将两个节点分别分组,并将它们放在同一等级。一个子图在中心顶部,另一个在中心底部。

现在我想从子图切换到聚类,以确保分组的节点始终彼此靠近放置,并且我想要具有边框和标签以使聚类可见。但是当我将子图名称更改为 "cluster_..." 时,它看起来像这样。

这里有什么问题?为什么 rank=same 不再按预期工作?此外,给定的 端口位置 不再按预期工作(边缘不再连接到节点的 south/north)。

我试图将 rank=same 从集群中拉出到自己的语句中,但这似乎完全覆盖了之前的集群语句,因为边框和标签消失了。另外,我尝试在节点连接上使用 constraint=false,但这弄乱了节点顺序,所以我对这种方法不太满意。

感谢任何帮助。如果你想重新创建图表,你可以找到使用过的图像 here

您是对的,因为文档 states、"rank" 属性 对子图起作用(簇不再是子图)。但是有什么问题,在你的集群中再放一个子图!

digraph INV_X1 {
    rankdir = "LR";
    edge [penwidth="2"];

/* Component styles */
    M_i_0 [shape=none;image="res/nmos.jpg"];
    M_i_1 [shape=none;image="res/pmos.jpg"];

/* Node styles */
    A [style=filled;color=green];
    ZN [style=filled;color=green];

/* Connections */
    M_i_0:n -> ZN;
    A -> M_i_0:w;
    subgraph cluster_a{
    /* Put M_i_0 and _VSS_0 on the same rank. */
        label="_VSS_0";
        subgraph g_VSS_0 {
            rank=same;
            _VSS_0 [shape=none;image="res/gnd.jpg";label=""];
            _VSS_0 -> M_i_0 [arrowhead=none];
        }
    }
    M_i_1:s -> ZN;
    A -> M_i_1:w;
    /* Put M_i_1 and _VDD_1 on the same rank. */
    subgraph cluster_b {
        label="_VDD_1";
        subgraph g_VDD_1 {
            rank=same;
            _VDD_1 [shape=none;image="res/pwr.jpg";label=""];
            M_i_1 -> _VDD_1 [arrowhead=none];
        }
    }
}

另请注意,由于某些原因,我更改了边 M_i_1 -> _VDD_1_VSS_0 -> M_i_0 的顺序。

结果: