Graphviz 点算法

Posted

技术标签:

【中文标题】Graphviz 点算法【英文标题】:Graphviz Dot Algorithm 【发布时间】:2013-10-15 05:41:33 【问题描述】:

Graphviz 库中是否有关于 dot 算法的任何文档(完整的伪代码?)?

我只找到了部分伪代码文档。

【问题讨论】:

【参考方案1】:

这里有一些参考资料供您参考。最完整的(缺少the Graphviz source code itself)可能是#2,论文“A Technique for Drawing Directed Graphs”,由 Graphviz 的几位贡献者自己撰写。

(1)“用点画图”

在Drawing graphs with dot中,dot的布局算法是这样描述的:

dot 分四个主要阶段绘制图形。了解这一点有助于您了解 dot 的布局类型以及如何控制它们。 dot 使用的布局过程依赖于非循环图。因此,第一步是通过反转某些循环边的内部方向来打破输入图中出现的任何循环。下一步将节点分配给离散的等级或级别。在从上到下的绘图中,等级确定 Y 坐标。跨越一个等级的边被分成“虚拟”节点链和单位长度边。第三步对等级内的节点进行排序以避免交叉。第四步设置节点的 X 坐标以保持边短,最后一步路由边样条。这是基于 Warfield [War77]、Carpano [Car80] 和 Sugiyama [STT81] 工作的大多数分层图形绘制程序的通用方法。我们将读者推荐给 [GKNV93] 以获得对 dot 算法的全面解释

该段中引用的论文如下:

[Car80] M. Carpano。自动显示分层图表以进行计算机辅助决策分析。 IEEE Transactions on Software Engineering,SE-12(4):538–546,1980 年 4 月。(显然可以购买 here。)

[GKNV93] Emden R. Gansner、Eleftherios Koutsofios、Stephen C. North 和 Kiem-Phong Vo。一种绘制有向图的技术。 IEEE Trans。软件工程,19(3):214–230,1993 年 5 月。(可在 Graphviz.org 网站上找到 here。)

[STT81] K. Sugiyama、S. Tagawa 和 M. Toda。层次系统结构的视觉理解方法。 IEEE Transactions on Systems, Man, and Cyber​​netics,SMC-11(2):109–125,1981 年 2 月。(显然可以购买 here。)

[War77] 约翰·沃菲尔德。交叉理论和层次映射。 IEEE Transactions on Systems, Man, and Cyber​​netics,SMC-7(7):505–523,1977 年 7 月。(显然可以购买 here。)

(2)“绘制有向图的技术”

dot 的算法在论文"A Technique for Drawing Directed Graphs" 中有详细描述,该论文于 1993 年发表在 IEEE Transactions on Software Engineering 杂志上(可在 Graphviz.org 网站上免费获得)。这是上面引用的“[GKNV93]”来源。

摘要是这样的:

我们描述了一种用于绘制有向图的四遍算法。第一遍使用网络单纯形算法找到最佳等级分配。第二遍通过迭代启发式设置等级内的顶点顺序,该迭代启发式结合了新颖的权重函数和局部转置以减少交叉。第三遍通过构建辅助图并对其进行排序来找到节点的最佳坐标。第四遍使样条线绘制边缘。该算法可以绘制好图纸并且运行速度很快。

(3)“使用 Graphviz 作为库”

"Using Graphviz as a Library" 在 3.1 节中提供了每个布局引擎算法的摘要。点的部分描述是这样的:

如果可能,点算法会根据边缘方向生成图的排序布局。它特别适用于显示层次结构或有向无环图。基本布局方案归功于 Sugiyama 等人[STT81] dot 使用的具体算法遵循 Gansner 等人描述的步骤[GKNV93]

点布局的步骤是:1) 初始化 2) rank 3) mincross 4) 位置 5) sameports 6) splines 7) CompoundEdges

初始化后,算法使用整数程序将每个节点分配给离散秩(rank),以最小化(离散)边长的总和。下一步(mincross)重新排列等级内的节点以减少边缘交叉。接下来是为节点分配实际坐标(位置),使用另一个整数程序来压缩图形并拉直边缘。此时,所有节点都会在坐标属性中设置一个位置。另外,设置了所有簇的bounding box bb属性。

“[GKNV93]”指的是“绘制有向图的技术”,如上链接。

“[STT81]”参考上文引用的“层次系统结构的视觉理解方法”。

(4) 您可能还对以下内容感兴趣:

Graphviz's Documentation Index,其中包含指向详细文档和其他背景材料的链接。

Graphviz's "Theory" page 链接到更多背景资料。

raw source code for dot 现在在 GitLab 上,请参阅 dotgen 和 dotgen2。 raw source code for dot,在 GitHub 上可用。

关于d3.js Google Group的一些相关讨论。

【讨论】:

以上是关于Graphviz 点算法的主要内容,如果未能解决你的问题,请参考以下文章

带有点/graphviz 的框图布局

算法图绘制工具Graphviz

graphviz 错误:点:无法打开 hello.dot(OSX El Capitan)

从 Graphviz 中的点图中删除不必要的负空间

如何在 macOS 的 Spyder (Anaconda) 中正确执行 Graphviz 中的“点”?

如何垂直而不是水平地制作点(graphviz)布局未连接的节点?