Layout 如何在GraphViz秩布局中实施从左到右的节点排序?

Layout 如何在GraphViz秩布局中实施从左到右的节点排序?,layout,graphviz,graph-visualization,Layout,Graphviz,Graph Visualization,我正在用GraphViz可视化一组过程。每个进程按程序顺序由一些读或写操作组成。当然,对于每个进程,最好按照从左到右的顺序安排操作 使用GraphViz(版本2.28),我的代码如下所示: digraph G { ranksep = 1.0; size = "10,10"; { node [shape = plaintext, fontsize = 20]; 0 -> 1 -> 2 -> 3 -> 4; } node [shape

我正在用GraphViz可视化一组过程。每个进程按程序顺序由一些读或写操作组成。当然,对于每个进程,最好按照从左到右的顺序安排操作

使用GraphViz(版本2.28),我的代码如下所示:

digraph G 
{
ranksep = 1.0; size = "10,10";
{ 
    node [shape = plaintext, fontsize = 20];
    0 -> 1 -> 2 -> 3 -> 4;
}
node [shape = box];
{rank = same;0;wy1;rf1;rc1;rz1;ry1;ra1;rb1;rx2;}
{rank = same;1;wf1;}
{rank = same;2;wx2;wc1;}
{rank = same;3;wf2;wz2;wx3;wa1;}
{rank = same;4;wz1;wy2;wx5;wb1;}
wy1 -> rf1;
rf1 -> rc1;
rc1 -> rz1;
rz1 -> ry1;
ry1 -> ra1;
ra1 -> rb1;
rb1 -> rx2;
wx2 -> wc1;
wf2 -> wz2;
wz2 -> wx3;
wx3 -> wa1;
wz1 -> wy2;
wy2 -> wx5;
wx5 -> wb1;
wf1 -> rf1[color = blue];
wc1 -> rc1[color = blue];
wz1 -> rz1[color = blue];
wy1 -> ry1[color = blue];
wa1 -> ra1[color = blue];
wb1 -> rb1[color = blue];
wx2 -> rx2[color = blue];

// W'WR Order:
wx3 -> wx2[style = dashed, color = red];

// W'WR Order:
wx5 -> wx2[style = dashed, color = red];
}
我很抱歉地说,我不允许发布声誉太低的输出图片。如果您可以运行代码,您将看到,由于pid=3的进程中出现了无序,因此结果并不令人满意。具体来说,GraphViz布局算法将(理想的)顺序“wf2->wz2->wa1->wx3”重新排列为“wx3,wf2,wz2,wa1”。因此,我的问题是:

我的问题:如何在排名环境中强制执行从左到右的节点排序

通过在这个网站上的探索,我发现了一些类似的问题和潜在的解决方案但是,在我的具体示例中,它们就是不起作用:

  • :constraint=false选项使我的PDF图片更糟。我查了一下,上面写着:

    在秩分配期间,边的头节点被约束在比尾节点更高的秩上。但是,如果边的constraint=false,则不强制执行此要求

    基于以上陈述,(我猜)constraint=false选项在不同级别之间生效,而不是在同一级别中生效

  • :令人惊讶的是,constraint=false选项在相同级别上对“有限状态机”帮助很大。再说一次,这并不能使我免于麻烦

  • :流程图在节点数和边数方面都是动态的。因此,使用节点的绝对位置(导致许多边交叉?)可能没有吸引力

    谢谢你的建议。可执行代码将非常受欢迎


我不太确定我是否正确地理解了你的问题,但是试着使用这个,如果它是你想要的,请发表评论。我添加了不可见边以正确排列节点,并使用rankdir使用左-右布局。

很抱歉延迟(无法访问internet)。这正是我想要的。非常感谢。您可能需要
[style=invi]
,而不是
[color=white]
。我认为您应该/可以根据官方文件自行安排顺序:“如果子图的ordering=out,那么子图中具有相同尾部节点的out边将按照创建顺序从左到右扇出。”
    digraph G 
{
ranksep = 1.0; size = "10,10";
{ 
    node [shape = plaintext, fontsize = 20];
    0 -> 1 -> 2 -> 3 -> 4;
}
node [shape = box];
{
rank = same;
0->wy1->rf1->rc1->rz1->ry1->ra1->rb1->rx2 [color=white];
rankdir=LR;
}
{
rank = same;
1->wf1[color=white];
rankdir=LR
}
{
rank = same;
2->wx2->wc1[color=white];
rankdir=LR;
}
{
rank = same;
3->wf2->wz2->wx3->wa1[color=white];
rankdir=LR;
}
{
rank = same;
4->wz1->wy2->wx5->wb1[color=white];
rankdir=LR;
}
wy1 -> rf1;
rf1 -> rc1;
rc1 -> rz1;
rz1 -> ry1;
ry1 -> ra1;
ra1 -> rb1;
rb1 -> rx2;
wx2 -> wc1;
wf2 -> wz2;
wz2 -> wx3;
wx3 -> wa1;
wz1 -> wy2;
wy2 -> wx5;
wx5 -> wb1;
wf1 -> rf1[color = blue];
wc1 -> rc1[color = blue];
wz1 -> rz1[color = blue];
wy1 -> ry1[color = blue];
wa1 -> ra1[color = blue];
wb1 -> rb1[color = blue];
wx2 -> rx2[color = blue];

// W'WR Order:
wx3 -> wx2[style = dashed, color = red];

// W'WR Order:
wx5 -> wx2[style = dashed, color = red];
}