使用点时如何对子图簇进行排序?

How do I order subgraph clusters when using dot?

我有一个点文件,我在其中创建了我希望以特定顺序出现的子图簇,假设我有这个:

digraph G {
    splines=true;
    sep="+25,25";
    overlap=scalexy;
    nodesep=0.6;
    subgraph cluster_2 {
        label="ADD_MORE_PROBLEMS";
        subgraph cluster_3 {
            label="pattern";
            N1 [label="problem"];
        }
        subgraph cluster_4 {
            label="replacement";
            N2 [label="problem"];
            N3 [label="problem"];
        }
    }
}

创建:

如何确保 "pattern" 出现在 "replacement" 的左侧(我可能有任意数量的子图)。

我无法给予和回答,但可以提供一些说明。强制布局的常用方法是引入隐藏边。在这种情况下,它不起作用。

如果没有嵌套簇,您可以使用rank=same 将连接的边强制到同一层。然后,一条不可见的边 N1 -> N2 [style = invis] 会强制节点进行正确的排序。

但是,使用等级约束节点会破坏集群成员资格并阻止该方案工作。

修改后的图表显示了结果。可能没有通用的解决方案。

digraph G {
    splines=true;
    sep="+25,25";
    overlap=scalexy;
    nodesep=0.6;
    subgraph cluster_2 {
        label="ADD_MORE_PROBLEMS";
        subgraph cluster_3 {
            label="pattern";
            N1 [label="problem 1"];
        }
        subgraph cluster_4 {
            label="replacement";
            N2 [label="problem 2"];
            N3 [label="problem 3"];
        }
        // Introduce hidden edge (shown dashed)
        N1 -> N2 [style = dashed];
        // Force nodes to remain at same rank
        { rank = same; N1; N2; }
    }
}

集群是一种奇怪的情况,其中仅代码中的排序就造成了大部分(如果不是全部)差异。如果我们像这样简单地重新排序您的代码:

digraph G {
    splines=true;
    sep="+25,25";
    overlap=scalexy;
    nodesep=0.6;
    subgraph cluster_2 {
        label="ADD_MORE_PROBLEMS";
        subgraph cluster_4 {
            label="replacement";
            N2 [label="problem"];
            N3 [label="problem"];
        }
        subgraph cluster_3 {
            label="pattern";
            N1 [label="problem"];
        }
    }
}

这一切都不同了。

现在,这可能会失败,在这种情况下,设置不可见边缘是更常见的解决方案之一。