问题描述
我正在使用graphviz(版本2.40.1(20161225.0304))将程序生成的点文件转换为png。基本上,我希望通过点文件来可视化的是一个有向图的无环图,即子图DAG(简称DAG),其中DAG的每个节点都是一个子图。为了进行可视化,我需要呈现(1)DAG的结构; (2)每个DAG节点的子图的拓扑。
例如,以下点文件将生成以下png,其中有3个DAG节点和2个DAG边。我使用cluster
表示每个DAG节点的子图。我认为它仍然可以被人类阅读。
digraph plan_v1 {
rankdir=LR
compound=true
subgraph cluster28 {
color=black // not query
shape=box
penwidth=3
label="id: 28\ndag id: 0\ncardinality: 100"
{
rank=min
28.0 [shape=box label="id: 0\nlabel: 0"]
28.1 [shape=box label="id: 1\nlabel: 0"]
}
28.0 -> 28.1 [label="label: 0"]
}
subgraph cluster29 {
color=black // not query
shape=box
penwidth=3
label="id: 29\ndag id: 1\ncardinality: 301"
{
rank=min
29.0 [shape=box label="id: 0\nlabel: 0"]
29.1 [shape=box label="id: 1\nlabel: 0"]
}
{
rank=max
29.2 [shape=box label="id: 2\nlabel: 0"]
}
29.0 -> 29.1 [label="label: 0"]
29.0 -> 29.2 [label="label: 0"]
29.1 -> 29.2 [label="label: 0"]
}
28.1 -> 29.0 [ltail=cluster28 lhead=cluster29 penwidth=1 minlen=2 label="latency: 0\ncost: 0\npath cost: 0\nsub tree cost: 479"]
subgraph cluster15 {
color=black // not query
shape=box
penwidth=3
label="id: 15\ndag id: 2\ncardinality: 376"
{
rank=min
15.0 [shape=box label="id: 0\nlabel: 0"]
15.1 [shape=box label="id: 1\nlabel: 0"]
}
{
rank=max
15.2 [shape=box label="id: 2\nlabel: 0"]
}
15.0 -> 15.1 [label="label: 0"]
15.0 -> 15.2 [label="label: 0"]
15.2 -> 15.1 [label="label: 0"]
}
28.1 -> 15.0 [ltail=cluster28 lhead=cluster15 penwidth=1 minlen=2 label="latency: 0\ncost: 0\npath cost: 0\nsub tree cost: 2319"]
}
问题是,当子图的顶点数增加时,graphviz将使用较大的空间来表示具有大子图的每个DAG节点。我想通过控制子图顶点的布局来减少大子图的空间。基本上,我的策略是,给定具有n
个顶点的子图,我将min
的等级赋予顶点ID 0
,并将1
,max
的等级赋予顶点ID {{ 1}}和n-1
,我要求顶点n-2
和2*i
的等级为2*i+1
的{{1}}。忘记告诉我我是graphviz的初学者,因此上述策略(但不是实现)的设计可能会出错。
使用上述策略,我发现如果子图DAG太复杂,graphviz可能无法生成png。这是一个示例:https://gist.github.com/zzxx-husky/50c5ad0cf56254dc0e01d7cb6b8389ad。
对于上面的要点示例,如果我直接使用graphviz将其转换为png,则graphviz会向我抛出段错误
same
我尝试在开始时添加0<i<(n-1)/2
,这可能有助于将点成功转换为png,但是graphviz仍然抱怨很多libpath/shortest.c:324: triangulation failed
libpath/shortest.c:192: source point not in any triangle
Error: in routesplines,Pshortestpath failed
Segmentation fault (core dumped)
并且png丑陋(DAG节点可能与每个重叠其他)。
最后,如果要成功将点转换为漂亮的png,则必须注释点中的所有rankdir=LR
。但是,png中的那些大型DAG节点需要大量空间才能显示其子图,并且大的子图看起来一团糟。
最后,我想知道我对Warning: XXX -> YYY: head not inside head cluster clusterZZZ
的使用是否不正确,以及如何减少显示较大子图的空间。预先感谢。
====== 20200810更新======
要回答@sroush的问题,我想要的是那些大的子图可以使用更少的空间来紧凑地呈现其拓扑。这是呈现具有7个顶点的子图的方式(下面的左侧)。子图边缘太长,弯曲异常。但我希望使用的空间更少,就像下面的右图那样,这样会更加整齐紧凑。可能有人指出,下图看起来较小是因为我删除了所有边缘标签。我想知道是否有可能使子图整齐,而子图边缘仍带有其标签。