Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I order subgraph clusters when using dot?

Tags:

graphviz

dot

I have a dot file in which I create subgraph clusters which I want to appear in a specific order, let's say I have this:

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"];
        }
    }
}

Which creates:

output from dot

How do I ensure that "pattern" appears to the left of "replacement" (I may have an arbitrary number of subgraphs).

like image 522
Josep Valls Avatar asked Feb 26 '17 01:02

Josep Valls


2 Answers

Clusters are one of the odd cases where simply the ordering in the code makes most (if not quite all) of the difference. If we simply reorder your code like this:

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"];
        }
    }
}

that makes all the difference.The "ADD_MORE_PROBLEMS" cluster contains both the "pattern" cluster and the "replacement" cluster. The "pattern" cluster is to the left of the "replacement" cluster. The "pattern" cluster contains a single node, labeled 'problem'. The "replacement" cluster contains two nodes, both labeled 'problem'.

Now, that can fail, in which case setting up invisible edges is one of the more common solutions.

like image 186
Michael Mol Avatar answered Jan 02 '23 11:01

Michael Mol


I can't give and answer, but can provide some clarification. The usual approach to force layout is to introduce hidden edges. In this case, it does not work.

Without the nested clusters, you can use rank=same to force connected edges onto the same level. Then, an invisible edge N1 -> N2 [style = invis] would force the nodes into the correct ordering.

However, constraining nodes with rank breaks the cluster membership and prevents the scheme from working.

The modified graph shows the result. There may not be a general solution.

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; }
    }
}

Constrained luster ordering

like image 45
Pekka Avatar answered Jan 02 '23 11:01

Pekka