Python Graphviz

17 Mar 2025 | 5 分钟阅读

什么是 Graphviz?

Graphviz 是开源的图表可视化编程。图表可视化是一种将底层数据表示为概念图和网络结构的方法。它在网络、生物信息学、软件工程、数据库和网站设计、人工智能以及其他技术领域的交互式可视化界面方面有重要应用。

要点

Graphviz 程序使用简单的文本语言来描述图,并以有用的格式生成图,例如:用于网页的图像和 SVG;用于包含在其他文档中的 PDF 或 Postscript;或在交互式图程序中显示。Graphviz 为实际图提供了许多有用的功能,例如:颜色、字体、节点形状、线型、超链接和自定义形状的选项。

软件架构

Graphviz 由一种名为 DOT 语言 的图描述语言和一组可以生成和/或处理 DOT 文件的工具组成。

  1. dot
    一个命令行工具,用于以各种输出格式(例如:PostScript、PDF、SVG、ASCII 文本等)生成有向图的分层布局。
  2. neato
    适用于无向图。"spring model" 布局以最小化全局能量。适用于多达约 1000 个节点的图。
  3. fdp
    适用于无向图。"spring model",它以最小化力而不是能量。
  4. sfdp
    fdp 的多尺度版本,用于布局大型无向图。
  5. twopi
    用于径向图布局。节点根据它们与给定根节点的距离放置在同心圆上。
  6. circo
    圆形布局。适用于某些具有许多循环结构(例如某些电信网络)的图。
  7. overview
    一个图形用户界面,用于可视化和编辑图。
  8. lefty
    一个可编程的(使用受 EZ 启发的语言)小部件,它显示 DOT 图并允许用户用鼠标对其进行操作。因此,Lefty 可以用作使用图表的模型-视图-控制器 GUI 应用程序中的视图。
  9. gml2gv - gv2gml
    转换为/从 GML,另一种图文件格式。
  10. graphml2g
    将 GraphML 文件转换为 DOT 格式。
  11. gxl2gv - gv2gxl
    转换为/从 GXL,另一种图文件格式。

Graphviz 的显著用途包括:

  • ArgoUML 的替代 UML 图渲染器,称为 argouml-graphviz。
  • AsciiDoc 可以将 Graphviz 语法嵌入为图。
  • Buffalo 可以输出 DOT 语法作为语言表示。
  • ConnectedText 具有 Graphviz 模块。
  • Doxygen 使用 Graphviz 生成图,包括类继承关系和源代码的协作关系。
  • FreeCAD 使用 Graphviz 显示文档中对象之间的关系。
  • Gephi 具有 Graphviz 模块。
  • Gramps 使用 Graphviz 创建家谱图。
  • Diagrams 是一个用于图操作和可视化的 Python 库。
  • OmniGraffle 5 及更高版本使用 Graphviz 引擎,具有有限的命令集,用于自动布局图。
  • Org-mode 可以处理 DOT 源代码块。
  • PlantUML 使用 Graphviz 从文本描述生成 UML 图。
  • Puppet 可以渲染 DOT 资源图,可以使用 Graphviz 查看。
  • Scribus 是一个开源 DTP 程序,可以通过在一种称为渲染帧的特殊框架类型中使用其内置引擎来使用 Graphviz 渲染图。
  • Sphinx 是一个文档生成器,可以使用 Graphviz 将图嵌入文档中。
  • TOra 是一个免费的数据库开发和管理 GUI,根据 GNU GPL 许可。
  • Trac wiki 具有 Graphviz 插件。
  • Zim 包含一个允许使用 Graphviz DOT 语言添加和编辑页面内图的模块。

Graphviz 示例

Sketchviz 使用 Graphviz,它可以将用 DOT 语言编写的图表描述解释为图像。您可以点击任何图像来启动该图表的交互式编辑器。官方文档是一个很棒的参考,但对于初学者来说并不理想。因此,我们编写了这个 Graphviz 教程,它介绍了其最有用的功能。

基础知识

图由节点和边组成。您可以使用 -- 或 -> 运算符在节点之间创建边。默认情况下,节点的标签是它的名称。

示例

您可以使用 -- 来创建一个graph

示例

或者一个digraph,它使用 ->

输出

Python Graphviz

可以通过指定属性来修改布局。图的属性通常位于图语句的顶部,而节点和边的属性则位于声明它们的方括号中。

示例


Python Graphviz

Graphviz 本身支持任何字体,但为了让我们的托管图正常工作,您需要坚持使用以下三种字体之一:

  • Tinos(这是默认值)
  • Handlee
  • Sedgwick Ave

示例


Python Graphviz

您可以为节点和边提供默认值,以避免重复。


Python Graphviz

高级图

恭喜,您现在已经掌握了创建有用图表所需的知识!接下来的技巧可能会有所帮助,但请不要觉得自己需要立即学会它们。

记录

shape=record 的节点会被特殊处理。请注意,您需要使用端口,用 表示,才能创建指向和来自记录的边。这些有助于显示表和对象结构。

示例

输出

Python Graphviz

集群(或子图)

您可以通过将相关节点放入名称以 cluster_ 开头的子图中来对它们进行分组。

示例

糟糕,那没有很好地展开!我们将添加 constraint=false 到 expressjs 和 awss-sdk 之间的边,以告诉 Graphviz 该边不意味着 expressjs 应该在优先级上更高。


Python Graphviz

示例:集群也可以嵌套。

输出

Python Graphviz

如果您希望箭头从集群边界开始或停止,您需要设置 compound=true 并使用边的 lhead 或 ltail 属性。

示例

输出

Python Graphviz