Graphviz集群更改内部节点的布局顺序 - 如何更正?

时间:2017-09-03 05:34:56

标签: graphviz dot pydot

使用dot:

渲染时,以下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];
}

}

enter image description here

当我按如下方式将节点放入群集时,布局会变为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];
}

}

enter image description here

如何强制群集节点以与非群集节点相同的C形状展开?我更喜欢一般的解决方案,因为我的实际图表相当复杂,并且在几个地方都有这个问题。

我目前正在使用pydot生成图表,以防相关。

1 个答案:

答案 0 :(得分: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];
    }

}

enter image description here