graphviz是一个由AT&T开源的c语言包,使用dot语言(一种DSL语言)来可视化程序的结构、流程、关系等。

graphviz有2部分构成:

  • Dot语言文件
  • 一组可以生成和/或处理DOT文件的工具

    命令

    | 命令 | 说明 | | —- | —- | | dot | 一个用来将生成的图形转换成多种输出格式的命令行工具。其输出格式包括PostScript,PDF,SVG,PNG,含注解的文本等等。 | | neato | 用于sprint model的生成(在Mac OS版本中称为energy minimized)。 | | twopi | 用于放射状图形的生成 | | circo | 用于圆形图形的生成。 | | fdp | 另一个用于生成无向图的工具。 | | dotty | 一个用于可视化与修改图形的图形用户界面程序。 | | lefty | 一个可编程的(使用一种被EZ影响的语言[4])控件,它可以显示DOT图形,并允许用户用鼠标在图上执行操作。Lefty可以作为MVC模型的使用图形的GUI程序中的视图部分。 |

dot语言

DOT语言是一种文本图形描述语言它提供了一种简单的描述图形的方法,并且可以为人类和计算机程序所理解。DOT语言文件通常是具有.gv或是.dot的文件扩展名。很多程序都可以处理DOT文件。

注释

//# 注释单行, /* */多行注释。

节点定义

通过 [ ]来定义节点属性

无属性节点(按默认属性来渲染)

graphviz - 图1

有属性节点:

graphviz - 图2

追加定义属性节点

通过node关键字追加属性,来影响接下来定义的节点
graphviz - 图3

划分作用域定义属性节点

通过{ } 划分独立作用域
graphviz - 图4

节点之间关系定义

通过 -- -> 来定义节点之间的关系,也称为“边”, 通过 [ ] 定义边的属性

一一关联

graphviz - 图5

批量关联

graphviz - 图6graphviz - 图7

常用属性

全局属性

属性名 默认值 说明
label 图片标签,如上面示例
bgcolor 背景颜色,颜色文档点此
fontcolor black 字体颜色,定义上面示例的颜色
fontname Times-Roman 字体
fontsize 14 字体大小
rank 子图等级限制, same,min,max,source,sink
rankdir TB 排序方向,LR(left to right) or TB(top to bottom)
compound false If true, allow edges between clusters. 配合 lhead 和 ltail 使用

节点属性

属性名 默认值 说明
label node name 节点显示内容
color black node边框颜色
fontcolor black 字体颜色
fillcolor 背景色
fontname Times-Roman 字体
fontsize 14 字体大小
shape ellipse 形状,box、ellipse、circle、diamond、plaintext、point、triangle、invtriangle
style 图形样式,eg. bold、dashed、dotted、filled
image 背景图片地址

shape 参考 graphviz - 图8

边属性

属性名 默认值 说明
label 描述关系
color black 箭头颜色
fontcolor black 关系文字颜色
dir forward 设置方向:forward,back,both,none
arrowhead normal 箭头头部形状。box、crow、diamond、dot、none、normal、vee。箭头文档点此
arrowtail 箭头尾部形状
arrowsize 1.0 箭头大小
style 图形样式,eg. bold、dashed、dotted、filled
lhead 当 compound 为true时,lhead用于指定边指向的cluster
ltail 与ltail类似

arrowhead 参考 graphviz - 图9

示例

子图

一个图可以包含多个子图,以及子图也可以嵌套子图。子图的名字须为cluster*,否则就直接当节点渲染了。 graphviz - 图10

二叉树

用 | 隔开的串会在绘制出来的节点中展现为一条分隔符,用 <> 括起来的串称为锚点。 graphviz - 图11记录形式的节点也可以是竖形排列的。与横向排列的记录的不同只是label的形式不同,label中内容使用 {} 包围则是竖形排列的。 graphviz - 图12

直接指向子图

边直接指向cluster,需要设置 compound 为true,并配合 lhead 或 ltail 来实现。 graphviz - 图13