【问题标题】:Using clusters reverses the order of rank=same使用集群反转 rank=same 的顺序
【发布时间】:2019-07-16 14:11:29
【问题描述】:

我有一个有向图,已设置为“rankdir=LR;”这样“rank=same”就会从上到下。

我决定在这个图表中添加一些集群,但结果“rank=same”现在变成了自下而上。

一个最小的例子说明了这个问题:

digraph graph {
graph [
    rankdir=LR;
    nodesep = "0.5 equally",
    newrank = true;
];

/* Guide Nodes */
rank1 [style=dotted];
rank2 [style=dotted];
rank1 -> rank2 [style=dotted];

/* Node Clusters */
subgraph cluster1 {
A;
B;
C;
}

/* Node Hierarchy */
A -> Z;
B -> Z;
C -> Z;

/* Node Rank */
{   rank=same;
rank1 -> A -> B -> C [style=dotted];
}

} /* Closes the digraph */

我想要的结果是从上到下:rank1,A,B,C。

我得到的结果是从上到下:C、B、A、rank1——如下图所示。

我怎样才能找回正确的订单?

  • 选项 1:不要使用集群。
  • 选项 2:重写“rank=same”行以适应从下到上的方向。

鉴于我的图表的大小,选项 2 工作量太大而收获太少。还有其他选择吗?

编辑:marapet 给出的答案是我想要的。但是,该解决方案不适用于以下最小问题:

digraph g {
graph [
    rankdir=LR;
    nodesep = "0.5 equally",
    newrank = true;
];

/* Node Clusters */
subgraph cluster1 {
    subgraph cluster2 {
    A;
    B;
    C;
    }
P;
    subgraph cluster4 {
    D;
    E;
    F;
    }
Z;
}

/* Guide Nodes */
rank1 [style=dotted];
rank2 [style=dotted];

/* Guide Nodes Hierarchy */
rank1 -> rank2 [style=dotted];

/* Node Hierarchy */
A -> Z;
B -> Z;
C -> Z;
P -> Z;
D -> Z;
E -> Z;
F -> Z;

/* Rank Constraints */
rank1 -> A -> B -> C -> P -> D -> E -> F [style=dotted, constraint=false];

} /* Closes the digraph */

结果如下图:

我只能得出结论,我遇到的问题是在同一等级边缘中混合集群和非集群的结果。

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

    除了使用rank=same,您可以使用constraint=false 来表示相同的ranke-edges:

    /* Node Rank */
    rank1 -> A -> B -> C [style=dotted, constraint=false];
    

    节点(引导节点和节点簇)的出现顺序也应该改变:

    digraph g {
    graph [
        rankdir=LR;
        nodesep = "0.5 equally",
        newrank = true;
    ];
    
    /* Node Clusters */
    subgraph cluster1 {
    A;
    B;
    C;
    }
    
    /* Guide Nodes */
    rank1 [style=dotted];
    rank2 [style=dotted];
    rank1 -> rank2 [style=dotted];
    
    /* Node Hierarchy */
    A -> Z;
    B -> Z;
    C -> Z;
    
    /* Node Rank */
    rank1 -> A -> B -> C [style=dotted, constraint=false];
    }
    

    一般来说,对于 LR 布局,自上而下布局图形并想象它逆时针旋转 90 度会有所帮助。

    【讨论】:

    • 感谢您的帮助。您的解决方案完成了我想要的大部分工作,但随后出现故障。我已经编辑了我的问题以演示它是如何崩溃的。当我知道问题无法解决时,我会接受你的回答。
    • 我以为方法是先提供节点信息,然后提供边缘信息,然后再提供排名约束? (根据我仍然犯了你指出的错误。)
    • 如何将你的P节点打包成一个集群并用color=white隐藏集群边界矩形?
    【解决方案2】:

    在问题中编辑的小扩展名。 在编辑中使用了单独的节点“p”,将其打包在子图中会得到更好的结果,尤其是在将颜色设置为白色时:like:

    subgraph cluster3 {
    P;
    graph[color=white];
    }
    

    我在输出中得到的唯一奇怪的事情是“C”和“P”之间有 2 条虚线/ 玩弄 'dir=back' 给出了一个解决方案。 完整代码:

    digraph g {
    graph [
        rankdir=LR;
        nodesep = "0.5 equally",
        newrank = true;
    ];
    
    /* Node Clusters */
    subgraph cluster1 {
        subgraph cluster2 {
        A;
        B;
        C;
        }
        subgraph cluster3 {
        P;
        graph[color=white];
        }
        subgraph cluster4 {
        D;
        E;
        F;
        }
        Z;
    }
    
    /* Guide Nodes */
    rank1 [style=dotted];
    rank2 [style=dotted];
    
    /* Guide Nodes Hierarchy */
    rank1 -> rank2 [style=dotted];
    
    /* Node Hierarchy */
    A -> Z;
    B -> Z;
    C -> Z;
    P -> Z;
    D -> Z;
    E -> Z;
    F -> Z;
    
    /* Rank Constraints */
    rank1 -> A -> B -> C [style=dotted, constraint=false];
    D -> E -> F [style=dotted, constraint=false];
    P -> C [dir=back, style=dotted, constraint=false];
    P -> D [style=dotted, constraint=false];
    
    } /* Closes the digraph */
    

    【讨论】:

    • 感谢您的解决方案。当我遇到两条虚线问题时我放弃了,因为那时我需要休息一下。破解算法而不是简单地告诉它要做什么是很累的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2012-05-18
    • 2018-04-17
    • 2018-11-04
    • 2016-06-14
    • 2023-04-02
    • 2021-06-18
    相关资源
    最近更新 更多