0%

图可视化之Graphviz

Graphviz 是由AT&T Research、Lucent Bell实验室开源的可视化图形工具,可以很方便的用来绘制结构化的图形网络。具体地,其使用一种名为dot语言的DSL来编写脚本

abstract.jpg

安装

Mac下直接利用brew安装Graphviz即可

1
2
3
4
5
# 更新brew
brew update

# 安装Graphviz
brew install graphviz

安装后查看版本信息,验证安装是否成功

1
2
# 查看版本信息
dot -v

figure 1.jpg

实践

无向图

1
2
3
4
5
6
7
// 无向图
graph graph1 {
a -- b;
b -- c;
b -- f;
a -- f;
}

可以直接通过如下命令进行渲染。典型地输出格式有:png、svg、jpeg等

1
2
3
4
5
# 将指定脚本文件 输出为 指定格式、指定名称的文件
dot <脚本文件名> -T <输出格式> -o <输出文件名>

# 将名为demo1.dot的脚本文件 输出为 格式为png、文件名为demo1.png的图片
dot demo1.dot -T png -o demo1.png

效果如下所示

figure 2.jpg

figure 3.jpg

有向图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 有向图
digraph graph2 {
a -> b;
b -> d;
c -> b;
b -> b;

// i -> j;
// i -> k;
// 该语句与上述语句效果等价
i -> {j,k};

// x -> z;
// y -> z;
// 该语句与上述语句效果等价
{x,y} -> z;

// n1 -> m1;
// n2 -> m1;
// n3 -> m1;
// n1 -> m2;
// n2 -> m2;
// n3 -> m2;
// 该语句与上述语句效果等价
{n1, n2, n3} -> {m1, m2};
}

为方便实时预览渲染效果,我们可以在VS Code当中编写dot脚本,然后在VS Code当中安装一个名为“Graphviz (dot) language support for Visual Studio Code”的插件

figure 4.jpg

至此,我们就可以实现实时预览,效果如下所示

figure 5.jpg

子图

子图可以提供一个单独的上下位文用于设置图的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 子图
digraph subgraphDemo {
// 设置节点的默认属性: 菱形、节点文本颜色为红色
node [shape=diamond, fontcolor="red"];
"杭州" -> "宁波";
"温州" -> "台州";
"宁波" -> "台州";

// 定义一个名为"江苏省"的子图
subgraph "江苏省" {
// 设置节点的默认属性: 六边形形、节点文本颜色为蓝色
node [shape=hexagon, fontcolor="blue"];
"南京" -> "苏州";
"苏州" -> "无锡";
"苏州" -> "扬州";
"无锡" -> "扬州";
}

"杭州" -> "嘉兴";
"温州" -> "杭州";
}

效果如下所示

figure 6.jpg

集群

当子图的名称以cluster开头时,则Graphviz会将该子图标记为Cluster集群。此时布局引擎会将集群内的节点绘制在一起,并在外部使用一个矩形框对其进行包裹。需要注意的是,该特性依赖于布局引擎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 集群
digraph clusterDemo {

"Auth Controller";
"Order Controller" -> "Order Service";
"Pay Controller" -> "Pay Service";

"Order Service" -> "Order Dao";
"Pay Service" -> "Pay Dao";

subgraph "cluster_service" {
label="Service层";
"Order Service";
"Log Service";
"Pay Service";

}

subgraph "cluster_dao" {
label="Dao层";
"Order Dao";
"Pay Dao";
}
}

效果如下所示

figure 7.jpg

属性设置

Graphviz提供了丰富的属性设置,以满足不同的可视化需求,实现丰富的展示效果,下面即是一个示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 属性设置
digraph graph3 {

// 设置图形属性: 图形名称
label = "属性设置效果图";
// 设置图形属性: 图形名称的位置位于顶部
labelloc="t"
// 设置图形属性: 画布背景色为 蓝、黄 渐变
bgcolor = "lightblue:lightyellow";

// 设置节点的默认属性: 菱形、节点文本颜色为红色
node [shape=diamond, fontcolor="red"];
// 设置a节点的属性: 三角形、图形颜色为绿色、节的文本为指定文本
a [shape=triangle, color=green, label="Hello"];

// 设置边的默认属性: 虚线
edge [style=dashed];

a -> b;
// 设置指定边的属性: 点线、边的文本为指定文本
c -> b[style=dotted, label="21"];
// 设置指定边的属性: 箭头尾部符号为方形、箭头头部符号为V形、箭头头部尾部均绘制
b -> k[dir=both, arrowtail=box, arrowhead=vee];
// 设置指定边的属性: 箭头尾部符号为方形、箭头头部符号为V形、只绘制箭头头部
b -> i[dir=forworad, arrowtail=box,arrowhead=vee];
// 设置指定边的属性: 箭头尾部符号为方形、箭头头部符号为V形、只绘制箭头尾部
b -> j[dir=back, arrowtail=box, arrowhead=vee];
}

效果如下所示

figure 8.jpg

参考文献

  1. 领域特定语言(2013年版) Martin Fowler著
请我喝杯咖啡捏~
  • 本文作者: Aaron Zhu
  • 本文链接: https://xyzghio.xyz/Graphviz/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!

欢迎关注我的微信公众号:青灯抽丝