使用Graphviz查找生成子图DAG的困难

问题描述

我正在使用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"]
}

subgraph dag example

问题是,当子图的顶点数增加时,graphviz将使用较大的空间来表示具有大子图的每个DAG节点。我想通过控制子图顶点的布局来减少大子图的空间。基本上,我的策略是,给定具有n个顶点的子图,我将min的等级赋予顶点ID 0,并将1max的等级赋予顶点ID {{ 1}}和n-1,我要求顶点n-22*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个顶点的子图的方式(下面的左侧)。子图边缘太长,弯曲异常。但我希望使用的空间更少,就像下面的右图那样,这样会更加整齐紧凑。可能有人指出,下图看起来较小是因为我删除了所有边缘标签。我想知道是否有可能使子图整齐,而子图边缘仍带有其标签。

enter image description here

enter image description here

解决方法

三种可能性-如果您喜欢其中任何一种,我都会发布输入文件。为边缘着色可能会有所帮助。
enter image description here enter image description here enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...