Как обеспечить порядок узлов слева направо в макете ранга GraphViz?

я визуализирую коллекцию процессов с помощью 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. В частности, алгоритм компоновки программ переставил (идеального) заказа "водостотьким wf2-> wz2 -> wa1 -> wx3" в "wx3, водостотьким wf2, wz2, wa1". Поэтому моя проблема:

Моя Проблема как применять слева направо упорядочение узлов в среде rank?

с исследованием на этом сайте я нашел некоторые аналогичные проблемы и потенциальное решение. однако, они просто не работали на моем конкретном примере:

  • Graphviz .dot node ordering: the ограничение = false опция сделала мое PDF-изображение хуже. Я проверил dot руководство пользователя он говорит:

    при присвоении ранга головной узел ребра ограничен более высоким рангом, чем хвостовой узел. Если ребро имеет ограничение=false, однако, это требование не выполняется.

    основываясь на приведенных выше утверждениях, (я думаю) ограничение = false опция вступает в силу между различными рангами, а не в том же ранге.

  • Graphviz - - - случайный порядок узлов и ребер, проходящих через метки: С удивлением, с ограничение = false опция помогла "конечной машине" много в том же звании. Опять же, это не спасает меня от беда.

  • graphviz: круговая компоновка при сохранении порядка узлов: график процесса динамичен как по количеству узлов, так и по ребрам. Итак, возможно, не привлекательно использовать абсолютное положение для узлов (чтобы вызвать пересечение многих ребер?).

    Спасибо за любые предложения. И исполняемый код будет оценен очень высоко.

dot file

1 ответов


    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];
}

Я не совсем уверен, что правильно понял вашу проблему, но попробуйте использовать это и прокомментировать, если это то, что вы хотите. Я добавил невидимые ребра для правильного ранжирования узлов и использовал rankdir для использования левого правого макета.