【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