使用 Graphviz 画拓扑图
使用 Graphviz 画拓扑图
0)前述
本文着重讲一下 Graphviz 的风格控制,基础一些的就不在这里讲啦。
graphviz 的主页是http://www.graphviz.org/。
Graphviz 的安装和使用请看这里:http://www.cnblogs.com/fengbohello/p/4689131.html
1)从 Record 开始
下面通过一个简单示例开始吧:
在 Graphviz 的文档页有如下一张图,下面就用它里开始练习了。
简单的 Record 风格
这幅图的dot代码如下:
digraph A {
node [shape=record];
struct1 [label="<f0> left|<f1> middle|<f2> right"];
struct2 [label="<f0> one|<f1> two"];
struct3 [label="hello \n world |{ b |{c|<here> d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
第一行,声明图的类型为 "digraph" 和图的ID 为 "A"
第二行,声明本图的node的类型均为Record
第三行,声明了一个结构体,并且结构体分为三部分,分别为f0,f1,f2。f0的名称为left,f1的名称为middle,f2的名称为right。这三部分用"|"隔开,并且他们都属于这个struct1这个结构体的label.
第四行,声明了struct2。
第五行,看起来稍微复杂些。这一行声明了结构体struct3,并且使用了三层嵌套。第一层是“helloworld”、“b,c,d,e,f”、“g”和“h”。第二层是“b,c,d,e,f”这一组被分割成了三部分:“b”、"c,d,e"和"f"。第三层是"c,d,e"又被分割成了"c"、“d“和“e”三部分。嵌套的时候,使用大括号进行隔离。
第六~七行,开始建立node间的关系。struct1的f0指向struct2的f0;struct1 的 f2 指向 struct3 的 here。
从这段脚本代码的直观感受,dot脚本语言是一个描述型语言。 相信参照这个例子,已经可以写出关系清晰的拓扑图了。
接下来我们再来看一下另一种写法。
digraph structs {
node [shape=plaintext]
struct1 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR>
<TD>left</TD>
<TD PORT="f1">middle</TD>
<TD PORT="f2">right</TD>
</TR>
</TABLE>>]; struct2 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR>
<TD PORT="f0">one</TD>
<TD>two</TD>
</TR>
</TABLE>>]; struct3 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR>
<TD ROWSPAN="3">hello<BR/>world</TD>
<TD COLSPAN="3">b</TD>
<TD ROWSPAN="3">g</TD>
<TD ROWSPAN="3">h</TD>
</TR>
<TR>
<TD>c</TD>
<TD PORT="here">d</TD>
<TD>e</TD>
</TR>
<TR>
<TD COLSPAN="3">f</TD>
</TR>
</TABLE>>]; struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
这段代码就不详细解释了,对照着图像仔细想一想,应该也能想明白。熟悉HTML同学应该一眼就看明白了,其中的table、tr、td等,就是HTML里面的table。照着这个思路去看,应该能理解的更快。其中的COLSPAN等关键字在文档页中可以找到其具体含义。
我想分析一下下面这个图:
代码如下(或者这里)
01 digraph G {
02 rankdir=LR
03 node [shape=plaintext]
04
05 a [
06 label=<
07 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
08 <TR>
09 <TD ROWSPAN="3" BGCOLOR="yellow">class</TD>
10 </TR>
11 <TR>
12 <TD PORT="here" BGCOLOR="lightblue">qualifier</TD>
13 </TR>
14 </TABLE>>
15 ]
16
17 b [shape=ellipse style=filled
18 label=<
19 <TABLE BGCOLOR="bisque">
20 <TR>
21 <TD COLSPAN="3">elephant</TD>
22 <TD ROWSPAN="2" BGCOLOR="chartreuse"
23 VALIGN="bottom" ALIGN="right">two</TD>
24 </TR>
25 <TR>
26 <TD COLSPAN="2" ROWSPAN="2">
27 <TABLE BGCOLOR="grey">
28 <TR>
29 <TD>corn</TD>
30 </TR>
31 <TR>
32 <TD BGCOLOR="yellow">c</TD>
33 </TR>
34 <TR>
35 <TD>f</TD>
36 </TR>
37 </TABLE>
38 </TD>
39 <TD BGCOLOR="white">penguin</TD>
40 </TR>
41 <TR>
42 <TD COLSPAN="2" BORDER="4" ALIGN="right" PORT="there">4</TD>
43 </TR>
44 </TABLE>>
45 ]
46
47 c [
48 label=<
49 long line 1<BR/>line 2<BR ALIGN="LEFT"/>line 3<BR ALIGN="RIGHT"/>>
50 ]
51
52 subgraph { rank=same b c }
53 a:here -> b:there [dir=both arrowtail = diamond]
54 c -> b
55 d [shape=triangle]
56 d -> c [label=<
57 <TABLE>
58 <TR>
59 <TD BGCOLOR="red" WIDTH="10"> </TD>
60 <TD>Edge labels<BR/>also</TD>
61 <TD BGCOLOR="blue" WIDTH="10"> </TD>
62 </TR>
63 </TABLE>>
64 ]
65 }
分析
第5行到第15行,定义了一个 node,这个 node 的label是一个table。图片的左下角就是这个node啦。
第7行,定义了这个table的属性,属性值如下:
属性 | 具体含义 |
---|---|
BORDER="value" | specifies the width of the border around the object in points |
CELLBORDER="value" | specifies the width of the border for all cells in a table. It can be overridden by a BORDER tag in a cell. |
CELLSPACING="value" | specifies the space, in points, between cells in a table and between a cell and the table's border. |
ROWSPAN="value" | specifies the number of rows spanned by the cell. |
BGCOLOR="color" | sets the color of the background. This color can be overridden by a BGCOLOR attribute in descendents. |
PORT="value" | attaches a portname to the object. (See portPos.) |
COLSPAN="value" | specifies the number of columns spanned by the cell. |
第8~13行,定义了两个单元格。
第17~45行 定义了node :b。
第17行,指明了node的shape是ellipse(椭圆),style是filled。
第19~40行,这段代码直接扔到html页面里面,也可以看到差不多相同的效果:
elephant | two | ||||
|
penguin | ||||
4 |
感觉不需要再写下去了,再写下去的话就是在写html了。所以放一个html的table教程链接吧。http://www.w3school.com.cn/tags/tag_table.asp
所以学好html是关键!!!
第53~56行,建立这几个node之间的关系。
Graphviz 官网的几个文档
同步发表:https://www.fengbohello.top/archives/graphviz-practice
使用 Graphviz 画拓扑图的更多相关文章
- 利用Graphviz 画结构图[转]
转自:http://www.cnblogs.com/sld666666/archive/2010/06/25/1765510.html 利用Graphviz 画结构图 1. Graphviz介绍 ...
- 利用Graphviz画出图
graphviz官网:http://www.graphviz.org/ 背景:有画图需要,之前见到别人用graphviz画,画出来的图漂亮,且自动帮你排版安排布局,所以自己想尝试用它画. 其中遇到的几 ...
- 用 Graphviz画神经网络图
用 Graphviz . 以下代码提供一个例子, 具体使用时做简单修改即可. digraph G { rankdir=LR splines=line nodesep=.05; node [label= ...
- 使用GraphViz画caffe网络结构图
参考http://blog.csdn.net/happynear/article/details/45440709 1. 安装pydot: sudo pip install pydot 2. 安装Gr ...
- 用Graphviz画简单依赖图示例
代码: digraph module { 0 [label="global.h"]; 1 [label="bst_operator.c"]; 2 [label= ...
- linux服务之iptables与firewalld
开发语言: 服务器端:在内核中实现,无守护程序 客户端:一般是cli界面下的iptables命令 相关包:iptables-1.4.7-11.el6.x86_64 netfilter/iptables ...
- linux下阅读源代码的工具
说来真是惭愧呀.一直在用VIM 做开发.却不知道VI 里还有这么好使的工具.以前一直都是用: find -type f -print | xargs grep -i **** 在源代码里查找. 原来L ...
- LAN路由
一.实验的目的: 实现不同子网之前的信息交流 二.如果 1.虚拟子网 VMnet8:192.168.233.0/24 VMnet1:172.16.1.0/24 2.虚拟机vm1 ip:1 ...
- Doxygen简单经验谈。。。
Doxygen,大名鼎鼎的文档生成工具,被Boost.OpenCasCade等诸多项目作为文档生成的不二人选.人说,才华横溢往往是高深莫测,这句话放在 Doxygen这里显然是不适用的.十八般武艺样样 ...
随机推荐
- Python3.4下安装pip和MySQLdb
想用pyhton3.4做数据分析,pip和MySQLdb是必要的,一个便于安装常用模块,一个用来操作数据库.当时安装这两个模块时,由于没有人指导,花了很多的时间才安装好. 安装pip时,按照网上的教程 ...
- Spark on YARN的部署
Spark on YARN的原理就是依靠yarn来调度Spark,比默认的Spark运行模式性能要好的多,前提是首先部署好hadoop HDFS并且运行在yarn上,然后就可以开始部署spark on ...
- gdb 调试多线程
基本i threads 等操作略过,只谈线程同步.异步控制: 先点到,gdb attach到主线程t1 时,所有线程都会停止,所谓同步异步效果,是指在apply continue到所有线程之后, 再切 ...
- 关于settimeout 和for循环
for(var i=0;i<3;i++){ setTimeOut(function(){ console.log(i) },500) }; 执行结果:3,3,3 ---------------- ...
- Mac上搭建Nginx + rtmp
介绍 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 安装步骤 1.先安装brew: /usr/bin/ru ...
- Css格式与布局
一.位置 1.绝对定位 position:absolute:绝对定位. 绝对位置的意思就是相对于浏览器边框的位置,回归到它应有的位置.也就是说,一个div使用绝对定位后是在浏览器边框的最左上角位置.而 ...
- 鼠标右击.exe的程序出现闪退(桌面重启)怎么办
桌面鼠标右击,然后点NVIDIA控制面板(或者按windows+S组合键,在底下输入NVIDIA,然后点NVIDIA控制面板) 好了,然后任意找个文件试试...如图,问题完美解决
- 前端实现图片懒加载(lazyload)的两种方式
在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽.这也就是们通 ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备一)
上节中提到在遍历创建控件树后,执行了以下操作: 1. CDialogBuilder构建各控件对象并形成控件树,并返回第一个控件对象pRoot: 2. m_pm.AttachDialo ...
- 让IIS支持bootstrap 增加svg和woff格式文件的支持
增加以下两种文件类型即可: .woff application/x-woff.svg image/svg+xml