使用Graphviz绘图

之前在电脑上绘图一直都是用visio或是各种在线的绘图网站,我个人觉得使用visio是一件很繁琐的事情。这学期有几节课需要绘图,我就又开始了对绘图方式的寻找。前几天偶然在网上发现了使用dot语言配合Graphviz绘图的方案,这种方案十分简洁明了。今天来介绍一下用Graphviz画图的方法。

dot语言

dot语言是一门专为绘图设计的语言。

  • 关键字

    dot语言的关键字有node、edge、graph、digraph、subgraph和strict。

    node:定义节点; edge:定义边;graph:定义无向图;digraph:定义有向图;subgraph:子图,继承父图属性:strict:防止相同两个节点之间重复连线

  • ID

    ID是我们自己定义的字符串,主要用于给图和节点命名。

    • 命名规则

      Any string of alphabetic ([a-zA-Z\200-\377]) characters, underscores ('_') or digits ([0-9]), not beginning with a digit;

      a numeral [-]?(.[0-9]+ | [0-9]+(.[0-9]*)? );

      any double-quoted string (“…”) possibly containing escaped quotes (")1;

      an HTML string (<…>).

      不由数字开头的字符串;纯数字;双引号包裹的字符串,引号需要\转义;尖括号包裹的HTML串。

    • 使用

      我们可以通过一个例子来了解ID的使用方式:

      1
      2
      3
      graph yourID{
      ……
      }

      通常画简单图时图名可以省略。

  • 结构声明

    1. 1
      2
      3
      4
      5
      6
      7
      8
      graph {
      ……
      }

      //有向图
      digraph {
      ……
      }
    2. 节点

      节点可以不经过声明直接使用。

      也可以提前声明从而给节点定义属性,如下例:

      1
      2
      3
      4
      digraph {
      a, b [color=blue]
      a->b;
      }
    3. 连线

      有向图使用->连线,无向图使用--连线。

安装Graphviz

Graphviz是由AT&T实验室发布的基于DOT语言脚本的自动绘图软件。它使用dot作为脚本语言,再用布局引擎解析dot脚本,并且自动布局生成设定格式图片。

第一种安装方式是在官网下载安装包,但在mac环境下,我推荐使用brew方式安装,在终端输入brew install graphviz即可。

使用Graphviz绘制第一个图

使用sublime text或者其他编辑器创建一个.dot后缀的文件,写入以下内容:

1
2
3
4
5
digraph {
a->b;
a->c;
b->c;
}

在命令行中执行dot -T png treeTest.dot -o treeTest.png,就能得到一个三条边的有向图treeTest.png如下:

命令行中 -T png是指定输出格式为png,也可以指定为svg、gif、pdf等格式。

节点属性

  • 设置节点属性

    1. 全局设置

      全局属性适用于一个图中的所有节点,用以下格式来全局设置节点属性:

      1
      2
      3
      4
      5
      graph {
      node [属性1=值1,属性2=值2 ...];

      ......
      }
    2. 部分设置

      当我们只想用设置图中一部分节点属性时,就应当使用局部属性设置:

      1
      2
      3
      4
      5
      6
      7
      8
      graph {
      //只设置node1节点
      node1[属性1=值1,属性2=值2...]
      //同时设置node2和node3节点
      node2, node3[属性1=值1,属性2=值2...]

      ......
      }
  • 常用属性

    我们可以通过一个例子来看一下节点的一些常用属性:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    digraph node_intro {
    node [fontname="Microsoft Yahei"];

    shape1 [shape=box, label="蓝色边框矩形 ", color=blue, fontsize=12];
    shape2 [shape=circle, label="红色填充圆形 ", style=filled, fillcolor=red];
    shape3 [shape=doublecircle, label="双圈圆形", fontsize=24];
    shape4 [shape=ellipse, label="红色字体椭圆 ", fontcolor=red];
    shape5 [shape=polygon, sides=4, skew=0.4, label="平行四边形 "];
    shape6 [shape=diamond, label="菱形 "];
    shape7 [shape=record, label="{记录1|记录2|记录3}"];
    shape8 [shape=none, label="无边框 "];
    shape1:s -> shape2 -> shape3 -> shape4 -> shape5 -> shape6 -> shape7 -> shape8;
    }

    绘制结果如下:

边属性

同样用一个例子来了解边的常用属性:

1
2
3
4
5
6
7
8
digraph edge_intro {
style0, style1, style2, style3, style4 [label=""];

style0 -> style1 [style=solid, label="双向箭头蓝色实线 ", dir=both, color=blue];
style1 -> style2 [style=bold, label="方块粗线 ", arrowhead=box];
style2 -> style3 [style=dashed, label="短划线 "];
style3 -> style4 [style=dotted, label="虚线 "];
}

绘制结果如下:

更多的属性可以去看官方文档图形部分箭头形状部分

结语

关于dot配合Graphviz绘图的内容就先介绍到这里啦。