毕设全记录——探索 Graphviz

这一篇会介绍画图利器 Graphviz,并展示一些有侧重点的应用,并记录在完成毕设过程中探索 Graphviz 的过程。

Graphviz 是一个开源的图形可视化软件,官网: http://graphviz.org/

用户只需要使用 DOT 语言声明图中应该有哪些节点和边,Graphviz 就可以自动生成一个布局美观的输出(支持几十种输出,常见的图片格式都包括在内)。在官网的 Gallery 中有很多相当厉害的效果,如下:


流程示例图,来自 Graphviz 官网

ER 示例图,来自 Graphviz 官网

数据结构示意图,来自 Graphviz 官网

这些都是自动生成出来的,是不是感觉 666 ?

但是有些同学看到还要先学 DOT 语言,就开始打退堂鼓了,实际上这个语言非常简单,几乎比 Markdown 都简单,看一两个例子就会写了 : ) 比如最简单的 Helloworld 例子:

digraph g {
    hello->world
}

就可以得到下图:

一个简单的例子

再来个稍微复杂点的例子,绘制一个树状图,代码如下。在毕设中 Graphviz 就被我用来生成类似这样的图。

digraph g {
    1->2 [label = "left"]
    1->3 [label = "right"]
    2->4
    2->5
    3->6
    3->7
}

就可以得到下图:

一个树的例子

实际上,Graphviz 能够提供的效果有很多很多种,无论是节点、边还是图,都有很多属性可以设置,在此就不一一列举了,官网的文档说得很清楚:http://graphviz.org/documentation/

当然了,虽然有这么多属性,但是常用的并不是很多。在毕设中,我经常用到的有以下几种属性:

  • [style=invis] :让边或节点不可见,还有很多其他值可以设置
  • [shape=point] : 设置节点的形状为一个点,还有很多其他值可以设置
  • [shape=box, style=filled, height=0.3, width=0.3] :也可以这么用,同时设置形状、风格、高度和宽度
  • [label="xxx"] :设置节点或边的标签(说明文字)为 xxx,就像上面的图一样
  • [xlabel="xxx"] :另外一种形式的标签,和 label 属性相比,位置略有变化。且 xlabel 和 label 可以同时使用
  • [tooltip="456
123"] :(注意:左边属性的;应该写成英文状态下的 ; 符号才能有换行效果,平台似乎有屏蔽机制,当写成英文状态下的 ; 时就看不到了,只能写成中文状态下的分号,见谅)设置节点或边的 tooltip 属性,当导出的图像格式为 svg 时,使用浏览器打开图像,光标移动到设置该属性的节点或边上方,会看到说明文字,如下所示:
tooltip 的例子

咳咳,写到这里发现还没说怎么安装和使用呢。。。赶快补上

以下步骤是对 Windows 系统的,Linux 下的使用请参考其他的文章。。。

1.打开下载页面https://graphviz.gitlab.io/_pages/Download/Download_windows.html 选择 .zip 文件下载并解压

2.有两种用法,一是用命令行,这个需要先添加环境变量,然后在命令行中敲命令。但是这个方法我不太熟,所以推荐另一个方法。打开 bin 目录,找到 gvedit.exe,这是一个编辑器,双击打开就可以写 DOT 语言描述的图,然后就可以设置输出格式、引擎之类的,最后生成结果。bin 目录中还有一个 GVedit.html 文件,是说明手册,可以参考。(可以看到 bin 目录还有很多可执行文件,里面有些工具很强大,还有待进一步的探索)

当写完 DOT 语言描述后,可以看到菜单栏有两个小人的图标,左边的是设置按钮,右边的是生成结果按钮,点击右边的按钮就可以立即看到 png 格式的输出图片。如果想要进一步设置的话,需要点击左边的按钮,如下图所示:

image.png

Layout Engine 布局引擎
这一项指定的是绘图引擎,对于绘制不同类型的图像,需要选择不同的引擎,这样就可以得到不同的效果。虽然有很多选项,但是官网只重点介绍了下面六种:

  • Dot:绘制“分层”或有向图的分层图。布局算法将边缘指向相同方向(从上到下或从左到右),然后尝试避免边缘交叉并减少边长。这个引擎是最常用的。
  • Neato:这是一种“弹簧模型”的布局,当图中的点的数目不是很大时,将该布局会作为默认布局。它使用一种最小化全局能量函数,相当于统计多维缩放。这个引擎的输出看起来有点挤成一堆的感觉。
  • Fdp:这是一种类似于neato的布局,是通过减少力而不是使用能量来实现的。当节点和边的数量有几十个甚至上百个时,这个引擎很好用。
  • Sfdp:用于大图形布局的fdp的多尺度版本。但是经过我的实践,感觉在节点或边的数目较多时,fdp 比 sfdp 生成的效果更好。(而且要使用这个引擎,需要用命令行,似乎 gvedit.exe 没有提供这个引擎)
  • Twopi:径向布局,节点根据它们与给定根节点的距离放置在同心圆上。其中根节点可以自行设置。
  • Circo:适合绘制某些多循环结构的图表,例如某些电信网络。
    至于其他的引擎,我没用过,感兴趣的同学可以试试看 : )

Output File Type 输出文件的格式
这个就比较简单了,支持很多很多的格式输出,常用的格式有 jpg、png 和 svg 等等。

Output File Name 输出文件的名字
这个也很简单,可以设置输出结果的名字和路径。

下面的其他选项我也不太清楚怎么使用,还在摸索中。。。如果有哪位大佬知道的话,欢迎在评论区交流 : )

最后,点击右下角的 OK,就可以生成输出结果了。


以上就是 Graphviz 的大致使用方式,当然还有很多更高级的用法和内容,由于个人精力原因,没有做进一步的探究。

不过,Graphviz 的官网给出了很多的资料,感兴趣的同学可以参考:

在资源页面,官网很贴心地搜集了一些很有用的工具,在毕设中,我使用了其中几个工具来实现绘图的自动化,详情敬请关注之后的博文~~~


最后,给出一些辛苦搜集并精心筛选后的 Graphviz 资料:
(其实仔细研读文档就能有很多的收获了)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容