Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GraphViz - How to have a subgraph be left-to-right when main graph is top-to-bottom?

Tags:

graphviz

I have a graph file like this:

digraph {
    "Step1" -> "Step2" -> "Step3";

    subgraph step2detail {
        "Step2" -> "note1";
        "Step2" -> "note2";
        "Step2" -> "note3";
        "Step2" -> "note4";
        rankdir=TB
   }
}

I want the subgraph step2detail to hang off to the right of 'Step2'.

Right now it looks like this:

enter image description here

I want Step1, Step2 and Step3 to all be vertically under each other and in 1 column.

like image 666
Amandasaurus Avatar asked Oct 12 '09 13:10

Amandasaurus


3 Answers

The trick to get the graph you described is to use two subgraphs and link from one to the other. The invisible edges in "details" are what keep the notes aligned.

digraph {
    rankdir="LR";

    subgraph steps {
        rank="same";
        "Step1" -> "Step2" -> "Step3";
    }

    subgraph details {
        rank="same";
        edge[style="invisible",dir="none"];
        "note1" -> "note2" -> "note3" -> "note4";
    }

    "Step2" -> "note1";
    "Step2" -> "note2";
    "Step2" -> "note3";
    "Step2" -> "note4";
}

The result is:

enter image description here

like image 192
irgeek Avatar answered Oct 24 '22 07:10

irgeek


Here's as simple as it gets - just use the group attribute to have graphviz prefer straight edges:

digraph {
    node[group=a, fontname="Arial", fontsize=14];
    "Step1" -> "Step2" -> "Step3";

    node[group=""];
    "Step2" -> "note1";
    "Step2" -> "note2";
    "Step2" -> "note3";
    "Step2" -> "note4";
}

graphviz output

like image 29
marapet Avatar answered Oct 24 '22 05:10

marapet


By grouping the Step nodes into a clustered subgraph, the output is as follows:

digraph {
    subgraph cluster_0 {
        color=invis;
        "Step1" -> "Step2" -> "Step3";
    }

    subgraph cluster_1 {
        color=invis;
        "Step2" -> "note4";
        "Step2" -> "note3";
        "Step2" -> "note2";
        "Step2" -> "note1";
   }
}

color=invis removes the border that would otherwise be drawn around the cluster

like image 7
Photodeus Avatar answered Oct 24 '22 05:10

Photodeus