使用 Graphviz 画拓扑图

0)前述

本文着重讲一下 Graphviz 的风格控制,基础一些的就不在这里讲啦。

1)从 Record 开始

下面通过一个简单示例开始吧:

在 Graphviz 的文档页有如下一张图,下面就用它里开始练习了。

简单的 Record 风格

这幅图的dot代码如下:

01digraph A {02 node [shape=record];03 struct1 [label=" left| middle| right"];04 struct2 [label=" one| two"];05 struct3 [label="hello \n world |{ b |{c| d|e}| f}| g | h"];06 struct1:f1 ->struct2:f0;07 struct1:f2 ->struct3:here;08 }

第一行,声明图的类型为 "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=<

left

middle

right

>];

struct2 [label=<

one

two

>];

struct3 [label=<

hello
world

b

g

h

c

d

e

f

>];

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

>

15 ]

16

17 b [shape=ellipse style=filled

18 label=<19

corn
f

3839penguin40414244344>

45 ]

46

47 c [

48 label=<49long line 1
line 2line 3>

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

Edge labels
also

>

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

corn

c

f

penguin

4

感觉不需要再写下去了,再写下去的话就是在写html了。所以放一个html的table教程链接吧。http://www.w3school.com.cn/tags/tag_table.asp

所以学好html是关键!!!

第53~56行,建立这几个node之间的关系。

Graphviz 官网的几个文档

python画拓扑图子图_使用 Graphviz 画拓扑图相关推荐

  1. 四心圆法画椭圆原理_四心圆法画椭圆的解析画法

    四心圆法画椭圆的解析画法 本文 舟绍 一种 用解析 法 确定 四心 四的 圆心 位置 画椭 圆的方法 .供 容器 设计 者及 制 图者 画椭 圆 时参考 . 关键饲-竺燮 解析法画蚀 怖 溃 四 心圆 ...

  2. java程序画米奇_儿童简笔画之拿着福字的米奇

    在平日里,看到大宝最喜欢看米奇的动画片了,之前,我就很想把米奇画下来,可是,一直都没时间画,这不,今天没事,就把客厅里的另一角,贴在墙裙瓷砖上的米奇画下来了吗?看着这个拿着福字的米奇,特别喜庆,也特别 ...

  3. python画代码流程图_Python使用graphviz画流程图过程解析

    问题描述 项目中需要用到流程图,如果用js的echarts处理,不同层级建动态计算位置比较复杂,考虑用python来实现 测试demo 实现效果如下 完整代码 import yaml import o ...

  4. python画厢式图_用matplotlib画箱体图(boxplot)

    画boxplot的接口为 matplotlib.pyplot.boxplot,不过在画之前,我需要好好理解一下箱体图所代表的含义和计算方法. 用一个实际的例子来说明如何画boxplot,这个例子来自w ...

  5. python绘制反比例函数_描点法画反比例函数图像的动态演示——数学软件GeoGebra制作教程...

    Gif动态图又又又上传不成功了,建议跳转链接查看全文:描点法画反比例函数图像的动态演示--数学软件GeoGebra制作教程​www.toutiao.com 关于描点法画函数图像,前面已有三篇,包括以一 ...

  6. 海龟画图 python一棵松树_教你画好一棵松:国画——松树的画法

    原标题:教你画好一棵松:国画--松树的画法 本文出自微信公众号:瀚墨云桥 --请及时关注哦,第一时间获取精选艺术资讯和深度艺术内容 松树在古代常被称为"百木之长",素有" ...

  7. 用python画一个人_用turtle画个单身狗送给自己~

    python视频教程栏目介绍如何使用turtle画图. 今年的双十一到了 但还有谁记得双十一是 单身狗的节日 单身狗的我是时候站出来 捍卫自己的权益了 单身是一种怎样的状态? 我们所有人都单身过,但也 ...

  8. python画圣诞树图片_庆祝新年?画一颗圣诞树?还是...

    关于节日 圣诞节,元旦,看大家(情侣)在朋友圈里发各种庆祝的或者祝福的话语,甚是感动,然后悄悄拉黑了.作为单身狗,我们也有自己庆祝节日的方式,今天我们就来实现一些祝福的效果. 需要说明的是,所有的效果 ...

  9. java用画线写字_用Java画线

    我已经尝试过使用此代码画一条线,并且效果很好. import java.awt.*; import javax.swing.*; public class New extends JFrame { p ...

最新文章

  1. python rjust() 方法 与 ljust()方法 的使用
  2. k3s安装和卸载:轻量级K8S
  3. tempdb 相关总结
  4. 小米12系列获3C认证:120W快充终于回归
  5. 豪气十足!联想Z6 Pro法拉利定制版本首现
  6. SpringCloud学习笔记012---SpringBoot启动时Caused by: java.lang.NoClassDefFoundError:
  7. 广西国际商务职业技术学院官网计算机功课,2019—2020学年秋季学期线上线下混合式教学课程听课情况汇报...
  8. vue组件通信之父子组件通信
  9. 自己的界面添加ani动态炫酷光标
  10. 古墓新手机器人_古墓新手任务攻略 - 玩家乐园 - 北大侠客行MUD论坛 - Powered by Discuz!...
  11. 2018年Linux发行版颜值排行榜发布啦!
  12. 求取SHP文件的最小外接矩形并裁剪图像
  13. 【干货总结】分层强化学习(HRL)全面总结
  14. 梦幻西游网络诊断找不到服务器,《梦幻西游》电脑版出现网络故障 受影响者可寻找恢复使者进行恢复...
  15. 如何解决您与此网站之间建立的连接不安全,该页面采用不加密的http传输协议?
  16. Ubuntu command 记录
  17. SAP系统中信用控制功能详解
  18. Redis数据类型——set
  19. Notes 发送失败 提示没有注册类, ClassID: {29131539-2EED-1069-BF5D-00DD011186B7}
  20. VC 操作excel

热门文章

  1. 转载-游戏数值对答录
  2. html5 websocket 自动断开,退出手机浏览器,websocket会自动关闭,不是长持续吗
  3. Git 配置SSH的端口号
  4. CSP-俄罗斯方块(简单易懂)
  5. 一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别
  6. 【文件整理工具】Python 代码整理我们电脑中的文件,So easy!
  7. Windows XP将显示桌面放到任务栏
  8. 关于PDSCH的码字个数问题
  9. 自媒体1000W+推荐爆文分析,这么写标题,不火也难
  10. 数据结构-数组-字符串匹配:Knuth-Morris-Pratt算法(详解附完整代码)