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文件。
注释
节点定义
无属性节点(按默认属性来渲染)
graph demo {foo1;foo2;bar1; bar2;}
有属性节点:
graph demo {foo1[label="foo1-name" shape="box"];foo2[label="foo2-name" shape="ellipse"];}
追加定义属性节点
通过node关键字追加属性,来影响接下来定义的节点
graph demo {foo1; foo2; foo3;node [shape=box]; bar1; bar2; bar3;node [color="#FF6347"]; baz1; baz2; baz3;}
划分作用域定义属性节点
通过{ } 划分独立作用域
graph demo {foo1; foo2; foo3;{node [shape=box, label=bar]; bar1; bar2; bar3;} //只影响本区域内的节点node [color="#FF6347"]; baz1; baz2; baz3;}
节点之间关系定义
通过 -- -> 来定义节点之间的关系,也称为“边”, 通过 [ ] 定义边的属性
一一关联
graph demo {foo1;foo2;foo3;foo1 -- foo2[label="关联", dir="both"];foo2 -- foo3;foo3 -- foo1;}
批量关联
graph demo {foo1;foo2;foo3;foo1 -- {foo2 foo3}[label="关联", dir="both"];}
```
graph demo {
foo1;
foo2;
foo3;
foo4;
{foo1 foo4} -- {foo2 foo3}[label="关联", dir="both"];
}
<a name="Nj8B3"></a>### 常用属性<a name="QHPUK"></a>#### 全局属性| 属性名 | 默认值 | 说明 || --- | --- | --- || label | | 图片标签,如上面`示例` || bgcolor | | 背景颜色,颜色文档[点此](http://www.graphviz.org/content/color-names) || fontcolor | black | 字体颜色,定义上面`示例`<br />的颜色 || 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 使用 |<a name="tGQ61"></a>#### 节点属性| 属性名 | 默认值 | 说明 || --- | --- | --- || 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 参考
digraph demo { bgcolor=”floralwhite” “box”[shape=box] “polygon”[shape=polygon,sides=7] “ellipse”[shape=ellipse] “circle”[shape=circle] “point”[shape=point] “triangle”[shape=triangle] “invtriangle”[shape=invtriangle] “plaintext”[shape=plaintext] “diamond”[shape=diamond] }
<a name="FZ6JH"></a>#### 边属性| 属性名 | 默认值 | 说明 || --- | --- | --- || label | | 描述关系 || color | black | 箭头颜色 || fontcolor | black | 关系文字颜色 || dir | forward | 设置方向:forward,back,both,none || arrowhead | normal | 箭头头部形状。box、crow、diamond、dot、none、normal、vee。箭头文档[点此](http://www.graphviz.org/content/arrow-shapes) || arrowtail | | 箭头尾部形状 || arrowsize | 1.0 | 箭头大小 || style | | 图形样式,eg. bold、dashed、dotted、filled || lhead | | 当 compound 为true时,lhead用于指定边指向的cluster || ltail | | 与ltail类似 |arrowhead 参考
digraph demo { bgcolor=”floralwhite” rankdir=LR
"box"->"crow"[arrowhead=box]"crow"->"curve"[arrowhead=crow]"curve"->"diamond"[arrowhead=curve]"diamond"->"dot"[arrowhead=diamond]"dot"->"inv"[arrowhead=dot]"inv"->"none"[arrowhead=inv]"none"->"normal"[arrowhead=none]"normal"->"tee"[arrowhead=normal]"tee"->"vee"[arrowhead=tee]"vee"->"box"[arrowhead=vee]#来个高级的用法a->b[arrowhead=lcrowortee]
}
<a name="FrQwE"></a>### 示例<a name="4yvtz"></a>#### 子图一个图可以包含多个子图,以及子图也可以嵌套子图。子图的名字须为`cluster*`,否则就直接当节点渲染了。
digraph demo { bgcolor=”beige”
subgraph cluster_husband {node[color="grey"]{"爸爸", "妈妈"} -> "我"}subgraph cluster_wife {{"岳父", "岳母"} -> "老婆"}"我" -> "老婆"[label="夫妻", dir="both"]{rank=same; "我", "老婆"}
}
<a name="rFwJt"></a>#### 二叉树用 | 隔开的串会在绘制出来的节点中展现为一条分隔符,用 <> 括起来的串称为锚点。
digraph demo {
bgcolor=”beige”
node [shape=”record”, height=.1]
node0[label=”
记录形式的节点也可以是竖形排列的。与横向排列的记录的不同只是label的形式不同,label中内容使用 {} 包围则是竖形排列的。
digraph demo { bgcolor=”beige” node [shape=”record”] a [label=”{a | b | c}”] }
<a name="opnxR"></a>#### 直接指向子图边直接指向cluster,需要设置 compound 为true,并配合 lhead 或 ltail 来实现。
digraph demo {
bgcolor=”beige”
compound=true
subgraph cluster0 {
a
}
subgraph cluster1 {
b
}
a -> b [lhead=cluster1];
}
```
