Кластер Graphviz меняет порядок расположения внутренних узлов — как исправить?

Следующие узлы graphviz располагаются в форме C, как и ожидалось, при рендеринге с использованием точки:

digraph G {
newrank=true;
"001_getCtInputChunk" [shape=rect, label="@disk_cache\ngetCtInputChunk"];
"004_augmentCtInputChunk" [shape=rect, label=augmentCtInputChunk];
"002_cache_dir" [shape=cylinder, label="Cache Dir\n(.pkl.gz)"];
"003_LunaDataset" [shape=box3d, label=LunaDataset];
"001_getCtInputChunk" -> "002_cache_dir";
"002_cache_dir" -> "001_getCtInputChunk";
"001_getCtInputChunk" -> "003_LunaDataset";
"003_LunaDataset" -> "004_augmentCtInputChunk";
subgraph  {
rank=same;
"001_getCtInputChunk" [shape=rect, label="@disk_cache\ngetCtInputChunk"];
"002_cache_dir" [shape=cylinder, label="Cache Dir\n(.pkl.gz)"];
}

subgraph  {
rank=same;
"004_augmentCtInputChunk" [shape=rect, label=augmentCtInputChunk];
"003_LunaDataset" [shape=box3d, label=LunaDataset];
}

}

введите здесь описание изображения

Когда я помещаю узлы в кластер следующим образом, макет меняется на Z-образный:

digraph G {
newrank=true;
subgraph cluster_dsets {
label="dsets.py";
shape=rect;
"001_getCtInputChunk" [label="@disk_cache\ngetCtInputChunk", shape=rect];
"004_augmentCtInputChunk" [label=augmentCtInputChunk, shape=rect];
"002_cache_dir" [label="Cache Dir\n(.pkl.gz)", shape=cylinder];
"003_LunaDataset" [label=LunaDataset, shape=box3d];
}

"001_getCtInputChunk" -> "002_cache_dir";
"002_cache_dir" -> "001_getCtInputChunk";
"001_getCtInputChunk" -> "003_LunaDataset";
"003_LunaDataset" -> "004_augmentCtInputChunk";
subgraph  {
rank=same;
"001_getCtInputChunk" [label="@disk_cache\ngetCtInputChunk", shape=rect];
"002_cache_dir" [label="Cache Dir\n(.pkl.gz)", shape=cylinder];
}

subgraph  {
rank=same;
"004_augmentCtInputChunk" [label=augmentCtInputChunk, shape=rect];
"003_LunaDataset" [label=LunaDataset, shape=box3d];
}

}

введите здесь описание изображения

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

В настоящее время я использую pydot для создания графиков, если это актуально.


person Eli Stevens    schedule 03.09.2017    source источник


Ответы (1)


Я изменил несколько мелких деталей, чтобы максимально приблизиться к результату, который вы ищете. nodesep дает немного лучшее разделение при использовании dir=both (вместо двух явных краев), дает достаточно места для стрелок. И, конечно же, dir-both рисует основное направление влево с rank=same, поэтому ваши узлы, которые были перевернуты, теперь отображаются в объявленном порядке. Наконец, я изменил ширину крайних левых элементов, чтобы они лучше выровнялись.

digraph G {

nodesep=0.5;

newrank=true;

subgraph cluster_dsets {
    label="dsets.py";
    shape=rect;
    "001_getCtInputChunk" [label="@disk_cache\ngetCtInputChunk", shape=rect, width=1.8];
    "004_augmentCtInputChunk" [label=augmentCtInputChunk, shape=rect];
    "002_cache_dir" [label="Cache Dir\n(.pkl.gz)", shape=cylinder];
    "003_LunaDataset" [label=LunaDataset, shape=box3d, width=1.8];
    }

"001_getCtInputChunk" -> "002_cache_dir" [dir=both];
"001_getCtInputChunk" -> "003_LunaDataset";
"003_LunaDataset" -> "004_augmentCtInputChunk";

subgraph  {
    rank=same;
    "001_getCtInputChunk" [label="@disk_cache\ngetCtInputChunk", shape=rect];
    "002_cache_dir" [label="Cache Dir\n(.pkl.gz)", shape=cylinder];
    }

subgraph  {
    rank=same;
    "004_augmentCtInputChunk" [label=augmentCtInputChunk, shape=rect];
    "003_LunaDataset" [label=LunaDataset, shape=box3d];
    }

}

введите здесь описание изображения

person TomServo    schedule 05.09.2017