Search code examples
graphvizsubgraph

Placement of nodes in a nested subgraph in Graphviz


I am trying to create a plot of a binary, coloring and marking different nodes in different colors.

To get the borders around the subtrees I use subgraphs which works almost perfectly fine:

graph G
{
graph [ranksep="0.25", nodesep="0.25"]
rankdir = TB;
node [shape=ellipse, style=filled, fillcolor="#0068B4", color=white, fontcolor=white, penwidth=10]
edge [arrowtail="none"]

subgraph cluster_0 {
  node [fillcolor="#99CC00"]
  color="#99CC00"
  style=filled
  fillcolor=white
  fontcolor="#99CC00"
  label="12 is the root of\n26's left child\r"
  18;
    subgraph cluster_01 {
      node [fillcolor="#00B0F0"]
      color="#00B0F0"
      fontcolor="#00B0F0"
      style=filled
      fillcolor=white
      label="4 is the root of                         \n12's left child                         \r"
      7   [fillcolor=white]
      4 -- 13
      4 --  7 [style=invisible]
      7 -- 13 [style=invisible] 
      { rank=same; 7, 13 }
      { rank=same; 4, 18 }
      
    }


  12 -- {4,18}
  
  { rank=same; 12 }
}

subgraph cluster_1 {
  node [fillcolor="#C00000"]
  color="#C00000"
  style=filled
  fillcolor=white
  fontcolor="#C00000"
  label="32 is the root of\n26's right child\r"
  
  35   [fillcolor=white]

  32 -- 38
  32 -- 35 [style=invisible]
  35 -- 38 [style=invisible] 
  
  { rank=same; 32 }
  { rank=same; 35, 38 }
}


26 -- {12, 32}


{ rank=same; 26 }

}

which leads to this output:

Output of the graphviz code above

As you can see, the node 18 is placed inside the blue subcluster. Is there an easy way to move that node "out of the box" other than placing a blank dummy node (like the invisible nodes 7 and 35) between 4 and 18?


Solution

  • But, adding graph [newrank=true] and rearranging a few lines makes things better:

    graph G
    {
    graph [ranksep="0.25", nodesep="0.25" newrank=true]
    rankdir = TB;
    node [shape=ellipse, style=filled, fillcolor="#0068B4", color=white, fontcolor=white, penwidth=10]
    edge [arrowtail="none"]
    
    subgraph cluster_0 {
      node [fillcolor="#99CC00"]
      color="#99CC00"
      style=filled
      fillcolor=white
      fontcolor="#99CC00"
      label="12 is the root of\n26's left child\r"
        subgraph cluster_01 {
          node [fillcolor="#00B0F0"]
          color="#00B0F0"
          fontcolor="#00B0F0"
          style=filled
          fillcolor=white
          label="4 is the root of                         \n12's left child                         \r"
          7   [fillcolor=white]
          4 -- 13
          4 --  7 [style=invisible]
          7 -- 13 [style=invisible] 
          { rank=same; 7, 13 }
        }
          { rank=same; 4, 18 }
      12 -- {4,18}
      { rank=same; 12 }
    }
    
    subgraph cluster_1 {
      node [fillcolor="#C00000"]
      color="#C00000"
      style=filled
      fillcolor=white
      fontcolor="#C00000"
      label="32 is the root of\n26's right child\r"
      35   [fillcolor=white]
      32 -- 38
      32 -- 35 [style=invisible]
      35 -- 38 [style=invisible] 
      { rank=same; 32 }
      { rank=same; 35, 38 }
    }
    26 -- {12, 32}
    { rank=same; 26 }
    }
    

    Gives: enter image description here