# Rank between source and sink

**URL:** <https://forum.graphviz.org/t/rank-between-source-and-sink/1667>\
**Category:** Help\
**Created:** [June 15, 2023, 7:47pm UTC](https://forum.graphviz.org/t/rank-between-source-and-sink/1667 "2023-06-15T19:47:53Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![dot](https://avatars.discourse-cdn.com/v4/letter/d/dc4da7/32.png) [@dot](https://forum.graphviz.org/u/dot)\
**Post date:** [June 15, 2023, 7:47pm UTC](https://forum.graphviz.org/t/rank-between-source-and-sink/1667/1 "2023-06-15T19:47:53Z")

</div>

# Problem

Is there a rank in-between `source` and `sink`?

It’d be nice to take nominal values (e.g., `rank=1`, `rank=2`,  
`rank=3`).

# MWE

## Have

```graphviz
digraph subset {
  // rankdir="LR"
  node [label="", shape="square"]
  edge [style="invis"]

  subgraph fullset {
    rank="source"

    fs0 [label="0"]
    fs1 [label="1"]
    fs2 [label="2"]
    fs3 [label="3"]
    fs4 [label="4"]
    fs5 [label="5"]
    fs6 [label="6"]
    fs7 [label="7"]

    fs0 -> fs1 -> fs2 -> fs3 -> fs4 -> fs5 -> fs6 -> fs7
  }

  subgraph rn {
    rank="sink"
    node [shape="none"]

    r0 [label="1"]
    r1 [label="0"]
    r2 [label="0"]
    r3 [label="1"]
    r4 [label="0"]
    r5 [label="1"]
    r6 [label="1"]
    r7 [label="0"]

    r0 -> r1 -> r2 -> r3 -> r4 -> r5 -> r6 -> r7
  }

  subgraph subset {
    rank="min"

    s0 [label="0"]
    s3 [label="3"]
    s5 [label="5"]
    s6 [label="6"]

    node [style="invis"]
    s1
    s2
    s4
    s7

    s0 -> s1 -> s2 -> s3 -> s4 -> s5 -> s6 -> s7
  }
}

```

## Want

`fullset` up top, `rn` in middle, `subset` on bottom (in order that they  
appear).

Produced the opposite by removing ranks and specifying `rankdir`:

 ![opposite digraph](https://global.discourse-cdn.com/graphviz/original/2X/c/c1fe4d253d2c4b56e1cc0145a06d9668480bf1a6.png)

[Edit here](http://magjac.com/graphviz-visual-editor/?dot=digraph%20subset%20%7B%0A%20%20rankdir%3D%22LR%22%0A%20%20node%20%5Blabel%3D%22%22%2C%20shape%3D%22square%22%5D%0A%20%20edge%20%5Bstyle%3D%22invis%22%5D%0A%0A%0A%20%20subgraph%20fullset%20%7B%0A%20%20%20%20%2F%2F%20rank%3D%22source%22%0A%0A%20%20%20%20fs0%20%5Blabel%3D%220%22%5D%0A%20%20%20%20fs1%20%5Blabel%3D%221%22%5D%0A%20%20%20%20fs2%20%5Blabel%3D%222%22%5D%0A%20%20%20%20fs3%20%5Blabel%3D%223%22%5D%0A%20%20%20%20fs4%20%5Blabel%3D%224%22%5D%0A%20%20%20%20fs5%20%5Blabel%3D%225%22%5D%0A%20%20%20%20fs6%20%5Blabel%3D%226%22%5D%0A%20%20%20%20fs7%20%5Blabel%3D%227%22%5D%0A%0A%20%20%20%20fs0%20-%3E%20fs1%20-%3E%20fs2%20-%3E%20fs3%20-%3E%20fs4%20-%3E%20fs5%20-%3E%20fs6%20-%3E%20fs7%0A%20%20%7D%0A%0A%20%20subgraph%20rn%20%7B%0A%20%20%20%20%2F%2F%20rank%3D%22sink%22%0A%20%20%20%20node%20%5Bshape%3D%22none%22%5D%0A%0A%20%20%20%20r0%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r1%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r2%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r3%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r4%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r5%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r6%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r7%20%5Blabel%3D%220%22%5D%0A%0A%20%20%20%20r0%20-%3E%20r1%20-%3E%20r2%20-%3E%20r3%20-%3E%20r4%20-%3E%20r5%20-%3E%20r6%20-%3E%20r7%0A%20%20%7D%0A%0A%20%20subgraph%20subset%20%7B%0A%20%20%20%20%2F%2F%20rank%3D%22min%22%0A%0A%20%20%20%20s0%20%5Blabel%3D%220%22%5D%0A%20%20%20%20s3%20%5Blabel%3D%223%22%5D%0A%20%20%20%20s5%20%5Blabel%3D%225%22%5D%0A%20%20%20%20s6%20%5Blabel%3D%226%22%5D%0A%0A%20%20%20%20node%20%5Bstyle%3D%22invis%22%5D%0A%20%20%20%20s1%0A%20%20%20%20s2%0A%20%20%20%20s4%0A%20%20%20%20s7%0A%0A%20%20%20%20s0%20-%3E%20s1%20-%3E%20s2%20-%3E%20s3%20-%3E%20s4%20-%3E%20s5%20-%3E%20s6%20-%3E%20s7%0A%20%20%7D%0A%7D%0A).

---

<div class="post-metadata">

**Author:** ![steveroush](https://avatars.discourse-cdn.com/v4/letter/s/a9adbd/32.png) [@steveroush](https://forum.graphviz.org/u/steveroush)\
**Post date:** [June 15, 2023, 8:52pm UTC](https://forum.graphviz.org/t/rank-between-source-and-sink/1667/2 "2023-06-15T20:52:27Z")

</div>

For the general case, no (see [Allow user to provide levels, or levels plus ordering (no ranking or crossing minimization), and let dot finish (#2023) · Issues · graphviz / graphviz · GitLab](https://gitlab.com/graphviz/graphviz/-/issues/2023)).  
But for a 3rd / middle rank, yes ([rank | Graphviz](https://graphviz.org/docs/attrs/rank/)):  
**rank=source** // exclusive  
**rank=same** // all the rest  
**rank=sink** // exclusive

---

<div class="post-metadata">

**Author:** ![dot](https://avatars.discourse-cdn.com/v4/letter/d/dc4da7/32.png) [@dot](https://forum.graphviz.org/u/dot)\
**Post date:** [June 15, 2023, 10:45pm UTC](https://forum.graphviz.org/t/rank-between-source-and-sink/1667/3 "2023-06-15T22:45:35Z")

</div>

Thank you, I hadn’t gotten a notification for your reply.

`same` actually does the trick!

Glad to see the idea of levels is being considered.

The problem remaining is that `node [shape="none"]` changes the size (as you pointed out in my other post) and `node [style="invis"]` also makes the label invisible.

[Check it out](http://magjac.com/graphviz-visual-editor/?dot=digraph%20subset%20%7B%0A%20%20node%20%5Bshape%3D%22square%22%2C%20label%3D%22%22%5D%0A%20%20edge%20%5Bstyle%3D%22invis%22%5D%0A%0A%0A%20%20subgraph%20fullset%20%7B%0A%20%20%20%20rank%3D%22source%22%0A%0A%20%20%20%20fs0%20%5Blabel%3D%220%22%5D%0A%20%20%20%20fs1%20%5Blabel%3D%221%22%5D%0A%20%20%20%20fs2%20%5Blabel%3D%222%22%5D%0A%20%20%20%20fs3%20%5Blabel%3D%223%22%5D%0A%20%20%20%20fs4%20%5Blabel%3D%224%22%5D%0A%20%20%20%20fs5%20%5Blabel%3D%225%22%5D%0A%20%20%20%20fs6%20%5Blabel%3D%226%22%5D%0A%20%20%20%20fs7%20%5Blabel%3D%227%22%5D%0A%0A%20%20%20%20fs0%20-%3E%20fs1%20-%3E%20fs2%20-%3E%20fs3%20-%3E%20fs4%20-%3E%20fs5%20-%3E%20fs6%20-%3E%20fs7%0A%20%20%7D%0A%0A%20%20subgraph%20rn%20%7B%0A%20%20%20%20rank%3D%22same%22%0A%20%20%20%20%2F%2F%20node%20%5Bshape%3D%22none%22%5D%20%20%2F%2F%20size%20mismatch%0A%20%20%20%20%2F%2F%20node%20%5Bstyle%3D%22invis%22%5D%20%20%2F%2F%20also%20makes%20label%20dissappear%0A%20%20%20%20%0A%20%20%20%20r0%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r1%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r2%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r3%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r4%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r5%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r6%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r7%20%5Blabel%3D%220%22%5D%0A%0A%20%20%20%20r0%20-%3E%20r1%20-%3E%20r2%20-%3E%20r3%20-%3E%20r4%20-%3E%20r5%20-%3E%20r6%20-%3E%20r7%0A%20%20%7D%0A%0A%20%20subgraph%20subset%20%7B%0A%20%20%20%20rank%3D%22sink%22%0A%0A%20%20%20%20s0%20%5Blabel%3D%220%22%5D%0A%20%20%20%20s3%20%5Blabel%3D%223%22%5D%0A%20%20%20%20s5%20%5Blabel%3D%225%22%5D%0A%20%20%20%20s6%20%5Blabel%3D%226%22%5D%0A%0A%20%20%20%20node%20%5Bstyle%3D%22invis%22%5D%0A%20%20%20%20s1%0A%20%20%20%20s2%0A%20%20%20%20s4%0A%20%20%20%20s7%0A%0A%20%20%20%20s0%20-%3E%20s1%20-%3E%20s2%20-%3E%20s3%20-%3E%20s4%20-%3E%20s5%20-%3E%20s6%20-%3E%20s7%0A%20%20%7D%0A%7D%0A).

---

<div class="post-metadata">

**Author:** ![dot](https://avatars.discourse-cdn.com/v4/letter/d/dc4da7/32.png) [@dot](https://forum.graphviz.org/u/dot)\
**Post date:** [June 15, 2023, 11:02pm UTC](https://forum.graphviz.org/t/rank-between-source-and-sink/1667/4 "2023-06-15T23:02:03Z")

</div>

Ou! [I think I got it with `width`](http://magjac.com/graphviz-visual-editor/?dot=digraph%20subset%20%7B%0A%20%20node%20%5Bshape%3D%22square%22%2C%20width%3D0.5%2C%20label%3D%22%22%5D%0A%0A%20%20edge%20%5Bstyle%3D%22invis%22%5D%0A%0A%0A%20%20subgraph%20fullset%20%7B%0A%20%20%20%20rank%3D%22source%22%0A%0A%20%20%20%20fs0%20%5Blabel%3D%220%22%5D%0A%20%20%20%20fs1%20%5Blabel%3D%221%22%5D%0A%20%20%20%20fs2%20%5Blabel%3D%222%22%5D%0A%20%20%20%20fs3%20%5Blabel%3D%223%22%5D%0A%20%20%20%20fs4%20%5Blabel%3D%224%22%5D%0A%20%20%20%20fs5%20%5Blabel%3D%225%22%5D%0A%20%20%20%20fs6%20%5Blabel%3D%226%22%5D%0A%20%20%20%20fs7%20%5Blabel%3D%227%22%5D%0A%0A%20%20%20%20fs0%20-%3E%20fs1%20-%3E%20fs2%20-%3E%20fs3%20-%3E%20fs4%20-%3E%20fs5%20-%3E%20fs6%20-%3E%20fs7%0A%20%20%7D%0A%0A%20%20subgraph%20rn%20%7B%0A%20%20%20%20rank%3D%22same%22%0A%20%20%20%20node%20%5Bshape%3D%22none%22%2C%20width%3D0.5%5D%0A%20%20%20%20%0A%20%20%20%20r0%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r1%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r2%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r3%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r4%20%5Blabel%3D%220%22%5D%0A%20%20%20%20r5%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r6%20%5Blabel%3D%221%22%5D%0A%20%20%20%20r7%20%5Blabel%3D%220%22%5D%0A%0A%20%20%20%20r0%20-%3E%20r1%20-%3E%20r2%20-%3E%20r3%20-%3E%20r4%20-%3E%20r5%20-%3E%20r6%20-%3E%20r7%0A%20%20%7D%0A%0A%20%20subgraph%20subset%20%7B%0A%20%20%20%20rank%3D%22sink%22%0A%0A%20%20%20%20s0%20%5Blabel%3D%220%22%5D%0A%20%20%20%20s3%20%5Blabel%3D%223%22%5D%0A%20%20%20%20s5%20%5Blabel%3D%225%22%5D%0A%20%20%20%20s6%20%5Blabel%3D%226%22%5D%0A%0A%20%20%20%20node%20%5Bstyle%3D%22invis%22%5D%0A%20%20%20%20s1%0A%20%20%20%20s2%0A%20%20%20%20s4%0A%20%20%20%20s7%0A%0A%20%20%20%20s0%20-%3E%20s1%20-%3E%20s2%20-%3E%20s3%20-%3E%20s4%20-%3E%20s5%20-%3E%20s6%20-%3E%20s7%0A%20%20%7D%0A%7D%0A).

I set `square` and `none` to `0.5`. I believe that’s what `square` is anyway, but hard-coded it for my sanity.

Ah, now it’s pretty spaced out though:  
 ![image](https://global.discourse-cdn.com/graphviz/original/2X/0/0e46d6ac247ccda79afc4bae65cee577ea816ad7.png)

I want to decrease the vertical spacing. I tried `ranksep=0.5` at the top of the digraph but to no avail.

---

<div class="post-metadata">

**Author:** ![dot](https://avatars.discourse-cdn.com/v4/letter/d/dc4da7/32.png) [@dot](https://forum.graphviz.org/u/dot)\
**Post date:** [June 15, 2023, 11:20pm UTC](https://forum.graphviz.org/t/rank-between-source-and-sink/1667/5 "2023-06-15T23:20:14Z")

</div>

That’s cause [`0.5` is the default](https://graphviz.org/docs/attrs/ranksep/).

`0.1` did it.

Here is the final working solution:

```plaintext
digraph subset {
  ranksep=0.1
  node [shape="square", width=0.5, label=""]
  node [shape="square", label=""]
  edge [style="invis"]

  subgraph fullset {
    rank="source"

    fs0 [label="0"]
    fs1 [label="1"]
    fs2 [label="2"]
    fs3 [label="3"]
    fs4 [label="4"]
    fs5 [label="5"]
    fs6 [label="6"]
    fs7 [label="7"]

    fs0 -> fs1 -> fs2 -> fs3 -> fs4 -> fs5 -> fs6 -> fs7
  }

  subgraph rn {
    rank="same"
    node [shape="none", width=0.5]

    r0 [label="1"]
    r1 [label="0"]
    r2 [label="0"]
    r3 [label="1"]
    r4 [label="0"]
    r5 [label="1"]
    r6 [label="1"]
    r7 [label="0"]

    r0 -> r1 -> r2 -> r3 -> r4 -> r5 -> r6 -> r7
  }

  subgraph subset {
    rank="sink"

    s0 [label="0"]
    s3 [label="3"]
    s5 [label="5"]
    s6 [label="6"]

    node [style="invis"]
    s1
    s2
    s4
    s7

    s0 -> s1 -> s2 -> s3 -> s4 -> s5 -> s6 -> s7
  }
}

```

![final solution](https://global.discourse-cdn.com/graphviz/original/2X/1/1020c3bc2d0181ffe5651409cb0c9f689ef2c5ac.png)

Marking this as solution for completeness, but wouldn’t have arrived at this solution without [@steveroush’s help](https://forum.graphviz.org/t/rank-between-source-and-sink/1667/2).
