子图和聚类中的“等级=相同”问题

时间:2019-04-07 17:09:46

标签: graphviz dot

从“普通”子图切换到簇时,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];
    }
}

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

Graph with subgraphs

现在,我想从子图切换到群集,以确保将分组的节点始终放置在彼此靠近的位置,并且我想使用边框和标签使群集可见。但是当我只是将子图名称更改为“ cluster _...”时,它看起来像这样。

Same graph with clusters

这是什么问题?为什么rank=same不再按预期工作?同样,给定的端口位置不再按预期工作(边缘不再在节点的南/北连接)。

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

感谢您的帮助。如果要重新创建图形,可以找到使用的图像here

1 个答案:

答案 0 :(得分:2)

您是对的,因为文档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的顺序。

结果: