按等级排列子集群

Arranging subclusters with rank

我有这张图:

digraph G{

  rankdir = TB;
    hyb[label="Hybrid calculation"];   

    k1[label=<k<SUB>1</SUB>>];
    k2[label=<k<SUB>2</SUB>>];
    kn[label=<k<SUB>n</SUB>>];

    // subgraph cluster_k1q {
        k1q1[label=<q<SUB>1</SUB>>];
        k1q2[label=<q<SUB>2</SUB>>];
        k1qn[label=<q<SUB>n</SUB>>];

        graph[style=dotted];
        {rank=same; k1q1;k1q2;k1qn}
    // }
    
    // subgraph cluster_k2q {
        k2q1[label=<q<SUB>1</SUB>>];
        k2q2[label=<q<SUB>2</SUB>>];
        k2qm[label=<q<SUB>m</SUB>>];

        graph[style=dotted];
        {rank=same; k2q1;k2q2;k2qm}
    // }

    // subgraph cluster_knq {
        knq1[label=<q<SUB>1</SUB>>];
        knq2[label=<q<SUB>2</SUB>>];
        knql[label=<q<SUB>l</SUB>>];
        
        graph[style=dotted];
        {rank=same; knq1;knq2;knql}
    // }


    hyb -> k1;
    hyb -> k2;
    hyb -> kn;


    k1 -> k1q1;
    k1 -> k1q2;
    k1 -> k1qn;

    k2 -> k2q1;
    k2 -> k2q2;
    k2 -> k2qm;

    kn -> knq1;
    kn -> knq2;
    kn -> knql;

    bands1 -> k1q2;
    bands1 -> k2qm;
    bands1 -> knq1
    bands2 -> k1qn;
    bands2 -> knq1;
    bands3 -> knql;
    bands3 -> k1q1;

    {edge[ style=invis];
        k1->k2->kn;
        k1q1->k1q2->k1qn->k2q1->k2q2->k2qm->knq1->knq2->knql;
    }

    { rank=min; hyb}
    { rank=same; k1;k2;kn}
    { rank=same; k1q1;k1q2;k1qn;k2q1;k2q1;k2qm;knq1;knq2;knql}
    { rank=max; bands1;bands2;bands3}
}

生成此图表:

所有的k都在一个层次上,所有的q都在一个层次上,band也是。然后我想使用簇在 qs 周围绘制一些框。因此,如果我取消注释上面代码中的子图,我必须注释这一行:

{ rank=same; k1q1;k1q2;k1qn;k2q1;k2q1;k2qm;knq1;knq2;knql}

我得到:

在这里,乐队与 qs 处于同一水平。我怎样才能从顶部图表中获得级别,从底部图表中获得漂亮的方框?

添加:newrank=true
参见:https://graphviz.org/docs/attrs/newrank/
(你也可以通过改变 bandX->qY 边的方向来实现它,像这样:k1q2->bands1 [dir=back]