【7】图形相关-5-graphviz

一、基本概念

DOT文件

DOT是一种文本图形描述语言。DOT语言文件通常具有.gv或是.dot的文件扩展名。当然,在编写好.dot或者.gv的文件之后,需要有专门的程序处理这些文件并将其渲染成为图片,dot就是其中一款程序,它可以将DOT语言描述的图形渲染成.png、.jpg、.pdf等多种类型。 ​ 当然,作为工具,dot本身是很原始的,就像gcc之于c代码,g++之于cpp代码一样,或许某些程序员会热衷于在终端使用这些工具,但也有很多人喜欢交互式的界面,所以就有了gvedit之类的工具,它提供交互式的窗口来使用dot等工具渲染DOT语言描述的图形。

Graphviz介绍

介绍一个高效而简洁的绘图工具graphviz。graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言): dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局。graphviz提供丰富的导出格式,如常用的图片格式,SVG,PDF格式等。

graphviz中包含了众多的布局器:

  • dot默认布局方式,主要用于有向图
  • neato基于spring-model(又称force-based)算法
  • twopi径向布局
  • circo 圆环布局
  • fdp用于无向图

graphviz最方便的地方在于能够很快的清晰的画出点与点之间的关系,并且有许多布局算法能够很好的去布局。 之前使用它画过流程图,如:

还有决策树。使用twopi画出数据的关联关系:

DOT & graphviz 的局限性

graphviz中有很多工具可以将DOT语言的文本渲染成为图片,但正如我们所见,我们在享受方便的编码的同时,将图片的布局等任务交给了这些工具,虽然这些工具有很不错的布局算法支持,但仍不一定能满足我们的要求,所以当对图片的布局有特殊要求时,DOT& graphviz就显示出了它的局限性。当然,我们可以再使用其他图片编辑器校正DOT语言生成的图片,但这种时候,DOT& graphviz的方便性或许早就消失殆尽了。

什么人适合使用DOT & graphviz

​ 就我个人体会而言,DOT & graphviz适合这些人使用:

​ 1. 像我一样的画图小白并且喜欢操作键盘远胜于鼠标; ​ 2. 没有熟练的掌握其他作图工具; ​ 3. 对图片布局等没有特殊要求; ​ 4. 要绘制的是流程图结构图之类的图而不是画小狗小猫山山水水。

三、Graphviz程序的使用

安装

yum install graphviz

使用

完整的命令为:

<cmd> <inputfile> -T <format> -o <outputfile>1

示例如下:

dot -T jpg tes.dot -o test.jpg
介绍
dot 渲染的图具有明确方向性。
neato 渲染的图缺乏方向性。
twopi 渲染的图采用放射性布局。
circo 渲染的图采用环型布局。
fdp 渲染的图缺乏方向性。
sfdp 渲染大型的图,图片缺乏方向性。

Graphviz支持的输出图片格式更是相当的多,常用的有以下几种:

  • pdf :
  • gif
  • png :
  • jpeg : 一种有损压缩图片格式
  • bmp : 一种位图格式
  • svg : 矢量图,一般用与Web,,可以用浏览器打开

ps : 矢量线图,多用于打印

更多的输出格式可以浏览Graphviz输出格式进行查看。

完整的例子:

编辑下面的脚本代码,保存为 test.dot

digraph G{
 
    size = "5, 5";//图片大小
    main[shape=box];/*形状*/
 
    main->parse;
    parse->execute;
 
    main->init[style = dotted];//虚线
 
    main->cleanup;
    edge[color = green]; // 连接线的颜色
 
    execute->{make_string; printf}//连接两个
 
    init->make_string;
    main->printf[style=bold, label="100 times"];//线的 label
 
    make_string[label = "make a\nstring"]// \n, 这个node的label,注意和上一行的区别
S
    node[shape = box, style = filled, color = ".7.3 1.0"];//一个node的属性
 
    execute->compare;
}

运行:

dot -Tpng sample.dot -o sample.png

同时,也可以通过display来查看图片的dot文件

display sample.png

例2:

建立一个first.dot脚本:

digraph first2{
a;
b;
c;
d;
a->b;
b->d;
c->d;
}

解释:digraph是画图类型,接触高级使用可以有不同的类型,first2可以和文件名first不一样。画了abcd4个点。然后a->b表示a点指向b点,如果有线条的指向,可以不用先声明点。即,上述代码等价于:

digraph first2{
a->b;
b->d;
c->d;
}

(2)画图

打开cmd到first.dot目录下,运行:

dot -Tpng first.dot -o first.png

可以得到画好的图形。

解释:dot表示使用的是dot布局,其他布局相应的修改即可,-T表示格式,即画成png格式,-o表示重命名为first.png。

在这里如果出现syntax error,可看第四部分常见问题解决。

(3)画图结果

上面的简单的代码得到以下结果:

三、Graphviz的python包

python 包的官方文档:

https://graphviz.readthedocs.io/en/stable/manual.html?highlight=render

构建决策树的图:

from sklearn import tree
import graphviz
dot_data = tree.export_graphviz(lin_reg_2,out_file =None)
graph = graphviz.Source(dot_data)
graph.render('pic/%s'% result_name)

报错:

OSError: [Errno 13] Permission denied

用sudo运行,结果还是报错:

graphviz.backend.ExecutableNotFound: failed to execute [‘dot’, ‘-Tpdf’, ‘-O’, ‘/data/user/sam/project/PFSC/data_analysis/1.2.build-linear-regression/pic/result/xxxx_c-2chain-30000-tree-mean.png’], make sure the Graphviz executables are on your systems' PATH

原来还得安装graphviz

sudo yum install graphviz

参考资料

这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn