graphvizimage-graphviz

GraphViz creating regular edges


I'm using GraphViz inside a Mediawiki site, that means that I cannot work on the svg file (unluckily). I created this graph

digraph GPPubProcess{
rankdir="TB";
node [shape = box fontsize=10];
edge [fontsize=10];
graph[size="7.75,10.25" overlap = false];

subgraph c2 {
    rank="same";
    N02 [label="Two?" shape=hexagon margin=0];
    N03 [label="Three"];
}

subgraph c4 {
    rank="same";
    N07 [label="Seven"];
    N06 [label="Six?" shape=hexagon margin=0];
    N05 [label="Five"];
}

subgraph c8 {
    rank="same";
    N11 [label="Eleven)" shape=hexagon margin=0];
    N12 [label="Twelve"];
}

subgraph c9 {
    rank="same";
    N13 [label="Thirteen?" shape=hexagon margin=0]];
    N14 [label="Fourteen"];
N17 [label="COMPLETED"];
}

N00 [shape=point];
N01 [label="One"];
N02 [label="Two?" shape=hexagon margin=0];
N04 [label="Four?" shape=hexagon margin=0];
N08 [label="Eight"];
N09 [label="Nine"];
N10 [label="Ten?" shape=hexagon margin=0];
N99 [shape=point];
N00->N01:n;
N01:s->N02:n;
N02:s->N04:n [label="  yes"];
N04:s->N05:n [label="  no" weight=30];
N05:s->N08:n [weight=30];
N08:s->N09:n [weight=30];
N09:s->N10:n [weight=30];
N10:s->N11:n [label="  no" weight=30];
N11:s->N17:n [label="  no"];
N17:s->N99;

N02 -> N03 [weight=0];
N04:e -> N06:n [label="  yes"];
N06 -> N05 [label="  no"] [weight=0];
N06 -> N07 [label="  yes"];
N10:e -> N06:s [label="  yes" weight=5];
N03:s -> N07:n;
N07:e -> N09:e [weight=0];

N11:e -> N12:w;

N15 [label="Fifteen"];
N16 [label="Sixteen"];

N12:s->N13:n [weight=5];
N13:s->N15:n [label="  no"];
N15:s->N16:n;

N13:e->N14:w [label="  yes" weight=5];

N14:n->N07:s;

N16:w->N05:w [weight=0];

}

that produces almost what I like, but links sixteen->five, ten->six and thirteen->fourteen make a lot of slalom between nodes. Is there a way to regularize them?

Also the link between six and five goes in the wrong direction but I wasn't able to make it right? Is there any trick?

Thank you very much.

Giorgio


Solution

  • I would start by removing the weight and compass point instructions (:n, :e, :s, :w). Those are forcing dot to make some weird decisions, especially the compass points. If you need to make changes to the default version, make one small change at a time. Unfortunately, the more you try to force dot to make a specific graph, the weirder it tends to get.

    Since you can't work with an SVG, at some point you have to give up getting exactly the graph you want and accept the graph that dot creates. There's a limit to how much you can coerce dot.

    The link between six and five (N06 -> N05) should have the arrowhead going from six to five. If you're seeing the arrowhead pointing at six, I think that's a bug in an earlier version of Graphviz. Try updating to the most recent release.

    This code:

    digraph GPPubProcess{
        rankdir="TB";
        node [shape = box fontsize=10];
        edge [fontsize=10];
        graph[size="7.75,10.25" overlap = false];
    
        subgraph c2 {
            rank="same";
            N02 [label="Two?" shape=hexagon margin=0];
            N03 [label="Three"];
        }
    
        subgraph c4 {
            rank="same";
            N07 [label="Seven"];
            N06 [label="Six?" shape=hexagon margin=0];
            N05 [label="Five"];
        }
    
        subgraph c8 {
            rank="same";
            N11 [label="Eleven)" shape=hexagon margin=0];
            N12 [label="Twelve"];
        }
    
        subgraph c9 {
            rank="same";
            N13 [label="Thirteen?" shape=hexagon margin=0];
            N14 [label="Fourteen"];
            N17 [label="COMPLETED"];
        }
    
        N00 [shape=point];
        N01 [label="One"];
        N02 [label="Two?" shape=hexagon margin=0];
        N04 [label="Four?" shape=hexagon margin=0];
        N08 [label="Eight"];
        N09 [label="Nine"];
        N10 [label="Ten?" shape=hexagon margin=0];
        N99 [shape=point];
        N00->N01;
        N01->N02;
        N02->N04 [label="  yes"];
        N04->N05 [label="  no"];
        N05->N08;
        N08->N09;
        N09->N10;
        N10->N11 [label="  no"];
        N11->N17 [label="  no"];
        N17->N99;
    
        N02 -> N03;
        N04 -> N06 [label="  yes"];
        N06 -> N05 [label="  no"];
        N06 -> N07 [label="  yes"];
        N10 -> N06 [label="  yes"];
        N03 -> N07;
        N07 -> N09;
    
        N11 -> N12;
    
        N15 [label="Fifteen"];
        N16 [label="Sixteen"];
    
        N12->N13;
        N13->N15 [label="  no"];
        N15->N16;
    
        N13->N14  [label="  yes"];
        N14->N07;
    
        N16->N05;
    
    }
    

    created this graph:

    no constraints

    adding [constraint=false] to N06 -> N05 helps eliminate intersections around N06, but then pushes N11 and N17 way off to the left:

    with constraint