零基础学编程029:程序员作图不用笔

现在写专业文章离不开图,有些图非常复杂但非常有规律,用PowerPoint或Visio画都很吃力,这时候会编程就轻松多了,比如下面这张状态转换图:

再比如这张数据结构图:

再比如英文小说《欺骗的女儿》中的人物关系图:

再比如这张超复杂的网络结点图:

有些图看起来简单,可能用PowerPoint画也费不了多少时间,但如果这种图需要频繁调整,那工作量可就大了去了。比如程序员经常画的流程图、类图、数据结构图等,公司里经常画的组织结构图、工作流图等。

对于这类非常有规律的图,还有一个强大的工具,它就是GraphViz。上面举的几个例图都是摘自它的官网:http://www.graphviz.org。这个GraphViz不仅仅是一个工具,而且还对应了一种画图的语言,称为DOT Language

安装与运行

到官网上点击Download链接,可以看到各种平台的下载安装包,支持Linux、Windows、Mac,我下载的是Windows平台的graphviz-2.38.msi安装包,安装过程一路默认下一步即可。完成之后,从开始菜单中找到gvedit.exe,运行它出现主界面。

Hello World

任何语言都有个Hello World,DOT Language也不例外。从File菜单中点击New,会新建一个子窗口,名称为graph1.gv,所有GraphViz的文件的扩展名都为.gv,刚才的gvEdit.exe的意思也明白了吧?

在文本编辑窗口中输入以下代码:

digraph G {
    hello -> world
}

再点击Graph菜单中的Layout,或者直接按F5键,弹出一个View窗口,一张简单的图就画出来了。

简单解释一下:

  • digraph表示有向图,是Directed Graph的缩写形式,什么是有向图?请参考《图论》
  • G是图的名称
  • 花括号{ }内是图形的描述语句
  • hello 和 world是两个节点node
  • -> 表示左边指向右边的一个边edge

类与对象图

在《零基础学编程028:面向对象编程OOP》里我画了一张图,实际上就是用GraphViz生成的。

图并不复杂,直接看代码:

digraph G {
    node[shape=box]
    Stock[style=filled]
    Stock -> {google; amazon; facebook; apple}
}

花括号内的代码就三行,记得按F5看看运行效果,解释一下:

  • node[ ... ]表示对图中的所有结点统一进行设置
  • [ ] 中设置一些属性,称为attr
  • shape=box把结点设置为矩形
  • Stock是结点的名称,由于前面已经设置了shape=box,所以也为矩形
  • stype=filled,填充的矩形
  • Stock -> {google; amazon; facebook; apple}相当于以下四句 Stock -> google Stock -> amazon Stock -> facebook Stock -> apple

小结:

  • GraphViz的语法挺简单,里面主要是结点node边edge
  • -> 表示一条有向边
  • 最复杂的是Attr,里面可以设置填充、排列、颜色、链接等等,详细内容以后再说,也可以参考官网的Documentation链接,长达N页的全英文详细说明,点击“阅读原文”慢慢看吧

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-03-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

【每周一坑】螺旋矩阵

今天这题,看起来挺简单,实际写出来并不容易。在以前公司我曾把它做过招聘的笔试题,结果惨不忍睹,不得不拿掉。 输出如图的螺旋矩阵: 1 2 3 4...

3517
来自专栏逸鹏说道

Toxy新手教程

Toxy新手教程 官方网站:http://toxy.codeplex.com Toxy是干嘛用的?它是.NET平台上的文件抽取框架,主要解决各种格式的内容抽取问...

2806
来自专栏木宛城主

Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 1)

『可复用』这个词相信大家都熟悉,通过『可复用』的组件,可以大大提高软件开发效率。 值得注意的事,当我们设计一个可复用的面向对象组件时,需要保证其独立性,也就是...

2195
来自专栏落影的专栏

OpenGLES进阶教程8-obj文件和mtl文件解析

教程 距离上一篇教程已经有两个月了,这两个月详细阅读GPUImage的源码,并写了详细解析,发现对OpenGLES的深入了解很有帮助。 上周一个简书的朋友问我...

3787
来自专栏DannyHoo的专栏

ios开发中使用Masonry对多个视图进行均匀布局

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1282
来自专栏程序员的知识天地

几个Python小案例,爱上Python编程!

Python是一种面向对象的解释型编程语言,源代码与解释器CPython遵守GPL协议,Python语法简洁清晰。

1312
来自专栏生信技能树

rMATS这款差异可变剪切分析软件的使用体验

rMATS最近刚现在出了rMATS 4.0.1版,相比之间的rMATS 3.2.5版,其用C,Python,Cython重写了该软件,运算速度提升了100倍,并...

6614
来自专栏CreateAMind

Understanding Mutual Information and its Use in InfoGAN

0-8的生成数字的变化和之前文章中出现的结果类似:beta-VAE 实验:mnist多图及代码

781
来自专栏Python中文社区

Python量子力学计算模拟以及数据可视化

專 欄 ❈Pytlab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,...

6569
来自专栏逍遥剑客的游戏开发

Untiy Native Render Plugin在VR中的绘制(二): 透明排序

2309

扫码关注云+社区