在用python实现决策树算法的时候发现可以利用dot和graphviz来可视化生成的决策树如下图,于是了解了下dot。

DOT语言是一种文本图形描述语言。它提供了一种简单的描述图形的方法,并且可以为人类和计算机程序所理解。

例如上图只需如下几行简单的文本:
然后利用graphviz软件将dot文件转化为png、pdf、gif等目标文件就可以可视化图片了。
简单用法
有向图
1234graph graphname {a -- b -- c;b -- d;}无向图
1234graph graphname {a -> b -> c;b -> d;}属性
DOT语言中,可以对节点和边添加不同的属性。这些属性可以控制节点和边的显示样式,例如颜色,形状和线形。可以在语句和句尾的分号间放置一对方括号,并在其中中放置一个或多个属性-值对。多个属性可以被逗号和空格(,)。节点的属性被放置在只包含节点名称的表达式后。123456789graph graphname {// label属性可以改变节点的显示名称a [label="Foo"];// 节点形状被改变了b [shape=box];// a-b边和b-c边有相同的属性a -- b -- c [color=blue];b -- d [style=dotted];}注释
DOT语言支持C语言与C++风格的单行与多行注释。另外,也支持Shell脚本风格的以#开头的注释。子图
使用subgraph定义子流程图;
常用属性
对于各种结构的通用的属性如下:
属性名称 | 默认值 | 含义 |
---|---|---|
color | black | 颜色 |
colorscheme | X11 | 颜色描述 |
fontcolor | black | 文字颜色 |
fontname | Times-Roman | 字体 |
fontsize | 14 | 文字大小 |
label | 显示的标签,对于节点默认为节点名称 | |
penwidth | 1.0 | 线条宽度 |
style | 1.0 | 样式 |
weight | 1.0 | 重要性 |
常用边属性如下:
属性名称 | 默认值 | 含义 |
---|---|---|
arrowhead | normal | 箭头头部形状 |
arrowsize | 1.0 | 箭头大小 |
arrowtail | normal | 箭头尾部形状 |
constraint | true | 是否根据边来影响节点的排序 |
decorate | 用一条线来连接edge和label | |
dir | forward | 设置方向:forward,back,both,none |
headclip | true | 是否到边界为止 |
tailclip | true | 与headclip类似 |
常用节点属性如下:
属性名称 | 默认值 | 含义 |
---|---|---|
shape | ellipse | 形状 |
sides | 4 | 当shape=polygon时的边数 |
fillcolor | lightgrey/black | 填充颜色 |
fixedsize | false | 标签是否影响节点的大小 |
常用图属性如下:
属性名称 | 默认值 | 含义 |
---|---|---|
bgcolor | 背景颜色 | |
concentrate | false | 让多条边有公共部分 |
nodesep | .25 | 节点之间的间隔(英寸) |
peripheries | 1 | 边界数 |
rank | same,min,source, max,sink,设置多个节点顺序 | |
rankdir | TB | 排序方向 |
ranksep | .75 | 间隔 |
size | 图的大小(英寸) |
高级用法
- 使用record的label属性生成表格
用一对双引号+一对花括号包含起来的就是表格内容,不同的格子之间用符号 | 隔开,尖括号里的内容表示一个锚点,如下图。

对应代码:
|
|
label支持HTML格式
表格锚点的应用
cell的锚点可以让使用者在cell之间画线。引用cell的锚点的语法为:
table: anchor_name

示例代码:
总结
graphviz的节点出现在画布上的位置事实上是不确定的,依赖于所使用的布局算法,而不是在脚本中出现的位置,这可能使刚开始接触graphviz的开发人员有点不适应。graphviz的强项在于自动布局,当图中的顶点和边的数目变得很多的时候,才能很好的体会这一特性的好处。