0%

Graphviz概述

Graphviz是一个强大的绘图工具,使用DOT语言描述图像。

Graphviz是什么

Graphviz是基于dot语言的绘图工具,可以画有向图、无向图、关系图、目录图、流程图等各种你知道的或不知道的图形。可以欣赏Graphviz的Gallery,以及Yifan Hu的gallery of large graphs

Graphviz使用DOT语言描述图形,并提供一组工具:

  • dot

    将生成的图形转换成多种输出格式,如PostScript,PDF,SVG,PNG,含注解的文本等等。

  • neato

    用于sprint model的生成(在Mac OS版本中称为energy minimized)。

  • twopi

    用于放射状图形的生成

  • circo

    用于圆形图形的生成。

  • fdp

    另一个用于生成无向图的工具。

  • dotty

    一个用于可视化与修改图形的图形用户界面程序。

  • lefty

    一个可编程的控件,它可以显示DOT图形,并允许用户用鼠标在图上执行操作。Lefty可以作为MVC模型的使用图形的GUI程序中的视图部分。

Graphviz使用DOT语言描述图形,而不是依赖于鼠标绘图,这就提供了无限的可能,主要体现在两个方面:

  • 自动生成图形描述文件,从而自动生成图形
  • 更加Geek的写作方式,比如在Org-mode中嵌入图形代码,在导出时自动生成图形文件

有一些强大的工具依赖或支持Graphviz,比如OmniGraffle
PlantUML

DOT语言简介

DOT语言使用离散数学中的Graph描述图形,包括三个基本元素:grahp,node,edge。下面是一个例子:

example.dot

1
2
3
4
5
6
7
8
9
10
digraph G {
main -> parse -> execute[label="edge label2"];
main -> init[label="edge label1"];
main -> cleanup;
execute -> make_string;
execute -> printf;
init -> make_string;
main -> printf;
execute -> compare;
}

执行命令dot -Tpng example.dot -o example.png,就可以生成如下的图形:

DOT通过属性可以设置node和edge的样式,比如:

1
2
3
4
5
6
7
graph graphname {
// label属性可以改变节点的显示名称
a [label="Foo"]; // 节点形状被改变了
b [shape=box]; // a-b边和b-c边有相同的属性
a -- b -- c [color=blue];
b -- d [style=dotted, label="无向图"];
}

生成的图形如下:

更多的属性设置可以参考官方文档

应用场景

Graphviz可以有很多玩法,常见的比如: