Graphviz,从左到右的有向图中的节点顺序(马尔可夫链)

Graphviz, order of nodes in left-to-right digraph (Markov chain)

我想使用 graphviz 制作简单马尔可夫链的图形。下面是我使用的代码和我得到的图表。

如何让所有节点按照它们在 .dot 文件中的相同顺序位于水平轴上?显然源文件中节点的顺序并没有解决问题。

(Nice to have) 如何使 2 和 3、3 和 4 以及 4 和 5 之间的边关于节点所在的水平轴对称?您可以看到 p 边是直的,但 q 是弯曲的。我想要它们都弯曲。

digraph {
    rankdir=LR;
    node [shape = circle];

    1
    2
    3
    4
    5
    6

    1 -> 1[label="1"];

    2 -> 1[label="q"];
    2 -> 3[label="p"];

    3 -> 2[label="q"];
    3 -> 4[label="p"];

    4 -> 3[label="q"];
    4 -> 5[label="p"];

    5 -> 4[label="q"];
    5 -> 6[label="p"];

    6 -> 6[label="1"];
}

最重要的一步是确保所有节点都处于同一等级:

digraph 
{
    rankdir=TB;
    node [ shape = circle ];
    { rank = same; 1 2 3 4 5 6 }

    2 -> 3[label="p"];
    3 -> 4[label="p"];
    4 -> 5[label="p"];
    5 -> 6[label="p"];
    6:ne -> 6:nw[label="1"];

    edge[ dir = back ];
    1:ne -> 1:nw[label="1"];
    1 -> 2[ label="q"];
    2 -> 3[label="q"];
    3 -> 4[label="q"];
    4 -> 5[label="q"];
}

产量