零基础学编程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 条评论
登录 后参与评论

相关文章

来自专栏web编程技术分享

HTML基础知识入门

2556
来自专栏我是攻城师

github代码搜索技巧

3995
来自专栏增长技术

Django实践:自定义用户系统

552
来自专栏IT杂记

Thrift Direct Memory OOM问题解决方法

FrameBuffer为AbstractNonblockingServer类的内部类,TThreadedSelectorServer继承了AbstractNon...

2169
来自专栏葡萄城控件技术团队

Html5 FileReader 对文件进行Base64编码

以Base64进行编码的数据Url开始越来越广泛的被应用起来,原来做Base64转换要自己写一个小程序来转,其实Html5的FileReader的readAsD...

1958
来自专栏大数据人工智能

2018年 阿里云大牛工程师经历过的20道大数据面试题!

1.Java中Class.forName和ClassLoader.loadClass的区别

3764
来自专栏云计算教程系列

如何在Python 3中安装pygame并创建用于开发游戏的模板

Pygame库是专门为了帮助您做出的游戏和其他多媒体应用Python编程语言的一个开放源代码模块。pygame 构建于高度可移植的SDL(Simple Dire...

982
来自专栏Linux驱动

25.Linux-Nor Flash驱动(详解)

1.nor硬件介绍: ? 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数...

2316
来自专栏梦里茶室

【Chromium中文文档】Profile架构(看看谷歌家的重构)

Profile架构 这篇文章描述了一个进行中的设计重构,始于2012年1月。 注意:2013年六月之后,这篇文章需要更新。相关的类被重命名(s/ProfileK...

20510
来自专栏cnblogs

Event(事件)的传播与冒泡

特性说明和原理图: 标准浏览器和Ie9+浏览器都支持事件的冒泡和捕获,而IE8-浏览器只支持冒泡 标准和Ie9+浏览器用stopPropagation()或c...

2019

扫码关注云+社区