Ubuntu下的Graphviz的基础使用方法
一、Graphviz介绍
graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局
1、什么是Graphviz
官网地址,https://www.graphviz.org/
Graphviz 是一款开源图形可视化软件。图形可视化是一种将结构信息表示为抽象图形和网络图的方法。它在网络、生物信息学、软件工程、数据库和网页设计、机器学习以及其他技术领域的可视化界面中有着重要的应用。
Graphviz 布局程序采用简单的文本语言描述图表,并将图表制作成有用的格式,如用于网页的图像和 SVG;用于其他文档的 PDF 或 Postscript;或在交互式图表浏览器中显示。Graphviz 有许多实用的具体图表功能,如颜色、字体、表格节点布局、线条样式、超链接和自定义形状等选项。
2、为什么需要Graphviz
支持图结构的可视化软件工具多得去,为什么需要Graphviz? 对于普通用户来说,当然可以百度搜索找到各类流程图
等各类软件,但是对于一个开发者来说,当我们在开发过程中,需要对我们的图数据结构,或某个流程等,做一个可视化,如何实现呢?市面上的软件一来过于重并不适用二次开发,二来并不开源他的文档定义你也无法基于它去输出或定制,于是Graphviz就有用武之地了;
开发过程中,我们可以根据需要生成一些开源的图结构
文件(*.dot
),然后使用Graphviz进行可视化查阅,或使用Graphviz进行格式转化,如把一个*.dot
生成*.svg
以用于web上预览
Graphviz支持几种布局引擎(即支持这读取这几种格式):
dot : 默认布局方式,主要用于有向图
neato : 主要用于无向图
twopi : 主要用于径向布局
circo : 圆环布局
fdp : 主要用于无向图
sfdp : 主要绘制较大的无向图
patchwork : 主要用于树哈希图(tree map)
说白了,Graphviz就是一个
图结构
可视化的一款软件,可以支持多种图文档的输入、输出;
这里查看官网支持的布局 https://graphviz.org/docs/layouts/
Graphviz支持输出的格式
pdf :
gif:
png :
jpeg : jpg有损压缩图片格式
bmp : 位图格式
svg : 矢量图,一般用与Web
ps : 矢量线图,多用于打印
二、Graphviz的安装及基本使用
1、下载及编译安装
下载源码graphviz-12.2.0
,点这里
# 解压
tar -zxvf graphviz-12.2.0.tar.gz
cd graphviz-12.2.0
# 编译及安装
./configure
sudo make
sudo make install
查看一下安装版本
$ dot --version
dot - graphviz version 12.2.0 (20241103.1931)
2、测试验证安装
先创建test.dot
的文件,dot的介绍见下文
$ touch test.dot
输入如下内容
digraph G{main -> parse -> execute;main -> init;main -> cleanup;execute -> make_string;execute -> printf;init -> make_string;main -> printf;execute -> compare;
}
将*.dot
解析导出*.svg
图片
$ dot -Kdot -Tsvg test.dot -o test.svg
上面的命令解析
-Kdot 采用dot布局
-Tsvg 生成svg格式图片
-o 指定输出文件名
执行完成后,生成一个test.svg
图片
我们可以查看一下当前Graphviz安装支持了哪些布局引擎及支持哪些输出格式
输入dot -K
后,按下两次Tab
健
$ dot -K
-Kcirco -Kfdp -Knop -Knop2 -Kpatchwork -Ktwopi
-Kdot -Kneato -Knop1 -Kosage -Ksfdp
输入dot -Kdot -T
后,按下两次Tab
健
$ dot -Kdot -T
-Tcanon -Tdot -Tgv -Tjson -Tplain-ext -Tsvg -Txdot
-Tcmap -Tdot_json -Timap -Tjson0 -Tpov -Tsvg_inline -Txdot1.2
-Tcmapx -Teps -Timap_np -Tpic -Tps -Tsvgz -Txdot1.4
-Tcmapx_np -Tfig -Tismap -Tplain -Tps2 -Ttk -Txdot_json
当然,ubuntu下还有更便捷的方式安装
sudo apt-get install graphviz
目前为止,我们使用Graphviz主要还是以命令行的方式进行使用,而且使用也主要是进行格式转化,基于此我们可想向一下的应用场景应该是这样,通过代码根据*.dot
的语法,创建一个*.dot
文件,将*.dot
文件采用命令行的方式,转为我们需要可视化格式(如:*.svg
)等;
有没更直接的方法,直接把Graphviz作为一个库函数,创建好图后,直接就输出*.dot
或*.svg
,而不是先自己自作*.dot
再用命令转格式呢?答案是有的,就是Graphviz的高阶应用
可以参考官方文档 Using Graphviz as a library
Graphviz提供c的库(pdf文档),同时还支持的如下一些脚本语言:
https://graphviz.org/docs/library/
三、dot脚本语言的基本语法
1、编辑工具安装
dot是作为Graphviz的主要图形描述语言,具有简洁、易用的特点,任何一款文本编辑器,都可以制作一个dot文件;
在学习dot基本语法之前,先介绍一款在VScode编辑器中,直接预览dot文件的插件——Graphviz Interactive Preview
,通过该插件可非常友好的实时编辑渲染dot文件
打开vscode,搜索Graphviz Interactive Preview
,点击install
安装
打开一个*.dot
文件,点击右侧的预览按钮,如下所示,直接可预览dot文件,生成如下右图所示
至此,我们可以非常方便的在左边编辑脚本,在右实时查看修改后的dot语法对图的影响!
2、dot语法
dot语法中的一些基本概念:图(Graph)、节点(node)、边(edge)
graph(图) 分为:无向图(Graph)
、有向图(Digraph)
,如下两个示例所示:
1)无向图
graph G {A -- B;A -- C;C -- D;D -- A;
}
上面的脚步生成图如下所示:
2)有向图
digraph G {A -> B;A -> C;C -> D;A -> D;B -> K;
}
生成的有向图如下所示:
3)更复杂图例子
当然,我们也可以对图的一些样式进行修改,同时也可以添加一些标签;我们来看一个更复杂一点的有向图例子:
digraph G {0 [label = A;color = red;];1 [label = B;];2 [label = C;];3 [label = D;];4 [label = E;];0 -> 1 [label = 1.2; color = blue; style = dashed;];0 -> 3 [label = 4.5;];2 -> 0 [label = 2.0;];3 -> 2 [label = 0.5;];2 -> 4 [label = 5.2;];1 -> 3 [label = 1.8;];3 -> 4 [label = 3.2;];
}
首先,我们来解析一下上面的dot脚本
首先与前面两个例子,不一样之处,在于这次前面两个,我们直接给出边指向(如:A到B,A -> B
),而这里的是先逐一给出node节点,同时还对节点给了一个别名label标签,每个节点的属性,在[]
中定义;
而同时边也单独给出定义,边的指向采用的顶点的索引来声明定义;而每个边也有属性定义;
最终生成图有向图如下所示:
4)图的样式定义修改
同样我们继续完善上面的例子,对整个图的样式进行定义,添加graph
、 node
关键字
digraph G {graph [rankdir = LR; ratio = fill; size = "3,3";];node [shape = circle;];edge [color =dimgrey];0 [label = A;color = red;];1 [label = B;];2 [label = C;];3 [label = D;];4 [label = E;];0 -> 1 [label = 1.2; color = blue; style = dashed;];0 -> 3 [label = 4.5;];2 -> 0 [label = 2.0;];3 -> 2 [label = 0.5;];2 -> 4 [label = 5.2;];1 -> 3 [label = 1.8;];3 -> 4 [label = 3.2;];
}
4.1 )常见的节点属性包括:
shape:节点的形状,如box(矩形)、circle(圆形)、record(记录形)、plaintext(纯文本)、point(点)等。
color:节点的颜色。
style:节点的样式,如solid(实线)、dotted(点线)、dashed(虚线)等。
label:节点的标签,用于显示节点的名称或描述。
width和height:节点的宽度和高度。
fixedsize:是否强制使用width和height属性指定的尺寸。
fontname和fontsize:节点标签的字体名称和大小。
fillcolor: 当节点的样式设置为 filled 时,此属性确定填充颜色。
4.2)常见的边属性包括:
color:边的颜色。
style:边的样式,如solid(实线)、dotted(点线)、dashed(虚线)等。
weight:边的权重,用于影响布局算法中边的相对重要性。
label:边的标签,用于显示边的描述。
arrowhead:箭头的形状,如normal(普通箭头)、dot(点箭头)、vee(倒三角箭头)等。
arrowtail:箭尾的形状,同样可以使用不同的形状值。
dir: 边的方向。例如 forward(默认,有向边)、back、both、none
5) 子图的定义
同时,我们还可以定义子图使用subgraph
来定义子图或声明为一个相关的节点集(就是为某一个或多个节点,加框框的效果)
digraph G {graph [rankdir = LR; ratio = fill; size = "3,3";];node [shape = circle;];edge [color =dimgrey];0 [label = A;color = red;];1 [label = B;];2 [label = C;];3 [label = D;];4 [label = E;];0 -> 1 [label = 1.2; color = blue; style = dashed;];0 -> 3 [label = 4.5;];2 -> 0 [label = 2.0;];3 -> 2 [label = 0.5;];2 -> 4 [label = 5.2;];1 -> 3 [label = 1.8;];3 -> 4 [label = 3.2;];subgraph cluster_1 {label = "Cluster A";color = blue;bgcolor = darkgray;node [style = filled; color = white;];0;0 -> 1 [label = "e1"; color = red;];};subgraph cluster_2 {label = "Cluster B";color = blue;bgcolor = darkgray;node [style = filled; color = white;];3;4;}
}
添加子图后,图的layout如下所示:
6)注释
我们还可以在dot中添加单行,或多行注释,语法如下:
digraph G {/* 这是一个多行注释 */a -> b; // 这是一个单行注释b -> c;# 这是一个以#开头的注释
}
这里有一篇详细一点的介绍,点这里
相关文章:
Ubuntu下的Graphviz的基础使用方法
一、Graphviz介绍 graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局 1、什么是Graphviz 官网地址,https://www.graphviz.org/ Gr…...
微积分复习笔记 Calculus Volume 1 - 6.8 Exponential Growth and Decay
6.8 Exponential Growth and Decay - Calculus Volume 1 | OpenStax...
React的ts文件中通过createElement拼接一段内容出来
比如接口返回一个值 const values [23.00, 40.00/kg];想做到如下效果, 如果单纯的用render渲染会很简单, 但是在ts文件中处理,所以采用了createElement拼接 代码如下: format: (values: string[]) > {if (!values || !val…...
Pinia之1:介绍Pinia、项目中引入Pinia
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Python双向链表、循环链表、栈
一、双向链表 1.作用 双向链表也叫双面链表。 对于单向链表而言。只能通过头节点或者第一个节点出发,单向的访问后继节点,每个节点只能记录其后继节点的信息(位置),不能向前遍历。 所以引入双向链表,双…...
5G基础学习笔记
功能软件化 刚性网络:固定连接、固定功能、固化信令交互 柔性网络:网元拆解成服务模块,基于API接口调用 服务化架构(SBA) Service based Architecture (SBA): 借鉴了业界成熟的SOA、微服务架…...
Python plotly库介绍
一、引言 在数据可视化领域,Python提供了众多强大的库。其中,plotly是一个功能强大、交互式的可视化库,可以创建各种类型的图表,包括线图、散点图、柱状图、饼图、3D图表等。它不仅提供了美观的可视化效果,还支持交互式…...
go编程中yaml的inline应用
下列代码,设计 Config 和 MyConfig 是为可扩展 Config,同时 Config 作为公共部分可保持变化。采用了匿名的内嵌结构体,但又不希望 yaml 结果多出一层。如果 MyConfig 中的 Config 没有使用“yaml:",inline"”修饰,则读取…...
手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案
手机实时提取SIM卡打电话的信令声音 --智能拨号器app的双SIM卡切换方案 一、前言 在蓝牙电话的方案中,由于采用市场上的存量手机来做为通讯呼叫的载体,而现在市面上大部分的手机都是“双卡双待单通”手机,简称双卡双待手机。即在手机开机后…...
探索Python WebSocket新境界:picows库揭秘
文章目录 探索Python WebSocket新境界:picows库揭秘第一部分:背景介绍第二部分:picows库概述第三部分:安装picows库第四部分:简单库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方案第…...
2024年11月24日Github流行趋势
项目名称:FreeCAD 项目维护者:wwmayer, yorikvanhavre, berndhahnebach, chennes, WandererFan等项目介绍:FreeCAD是一个免费且开源的多平台3D参数化建模工具。项目star数:20,875项目fork数:4,117 项目名称࿱…...
NewStar CTF week5 Crypto wp
easy_ecc ecc的模板题,稍加推理就会发现c1mc2*k因此做一个减法就行,需要注意的点是c1,c2必须放到ecc里面过一道才能出正确结果 k 86388708736702446338970388622357740462258632504448854088010402300997950626097 p 644088904089909773124499208053…...
vue3+antd注册全局v-loading指令
文章目录 1. 创建指令文件2. 全局注册3. 使用 1. 创建指令文件 src/directives 在directives中创建如下文件 src│─directives│ index.ts└─loadingindex.tsindex.vuedirectives/ index.ts export * from ./loadingdirectives/loading/index.ts import { createApp } f…...
初试无监督学习 - K均值聚类算法
文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象,并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…...
捉虫笔记(七)-再探谁把系统卡住了
捉虫笔记(七)-再探谁把系统卡住 1、内核调试 在实体物理机上,内核调试的第一个门槛就是如何建立调试链接。 这里我选择的建立网络连接进行内核调试。 至于如何建立网络连接后续文章再和大家分享。 2、如何分析 在上一篇文章中,我们…...
【Linux课程学习】:《简易版shell实现和原理》 《哪些命令可以让子进程执行,哪些命令让shell执行(内键命令)?为什么?》
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 打印命令行提示符(PrintCommandLin…...
2024年11月27日Github流行趋势
项目名称:screenshot-to-code 项目维护者:abi clean99 sweep-ai kachbit vagusX项目介绍:通过上传截图将其转换为整洁的代码(支持HTML/Tailwind/React/Vue)。项目star数:62,429项目fork数:7,614…...
Java中的线程池使用详解
文章目录 Java中的线程池使用详解一、引言二、线程池的创建与使用1、线程池的创建1.1、FixedThreadPool(固定大小线程池)1.2、CachedThreadPool(可缓存线程池)1.3、SingleThreadExecutor(单线程化线程池)1.…...
Redis(概念、IO模型、多路选择算法、安装和启停)
一、概念 关系型数据库是典型的行存储数据库,存在的问题是,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。 Redis在生产中使用的最多的是用作数据缓存。 服务器先在缓存中查询数据,查到则返回,…...
计算机网络 第4章 网络层
计算机网络 (第八版)谢希仁 第 4 章 网络层4.2.2 IP地址**无分类编址CIDR**IP地址的特点 4.2.3 IP地址与MAC地址4.2.4 ARP 地址解析协议4.2.5 IP数据报的格式题目2:IP数据报分片与重组题目:计算IP数据报的首部校验和(不正确未改) …...
Java学习笔记--继承方法的重写介绍,重写方法的注意事项,方法重写的使用场景,super和this
目录 一,方法的重写 二,重写方法的注意事项 三,方法重写的使用场景 四,super和this 1.继承中构造方法的特点 2.super和this的具体使用 super的具体使用 this的具体使用 一,方法的重写 1.概述:子类中有一个和父类…...
高级java每日一道面试题-2024年11月27日-JVM篇-JVM的永久代中会发生垃圾回收么?
如果有遗漏,评论区告诉我进行补充 面试官: JVM的永久代中会发生垃圾回收么? 我回答: 在Java虚拟机(JVM)的历史版本中,确实存在一个称为“永久代”(Permanent Generation, 或者简称PermGen)的内存区域。永久代主要用…...
Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表
使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表(或依赖下拉列表)的概念令人兴奋,但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框,分别显示…...
基于混合ABC和A*算法复现
基于混合ABC和A*算法复现 一、背景介绍二、算法原理(一)A*算法原理(二)人工蜂群算法原理(三)混合ABC和A*算法策略 三、代码实现(一)数据准备(二)关键函数实现…...
狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程
Mac分享吧 文章目录 狂野飙车8(Asphalt 8) for Mac 赛车竞速游戏软件 效果图展示一、狂野飙车8(Asphalt 8) 赛车竞速游戏 Mac电脑版——v2.1.11️⃣:下载软件2️⃣:安装软件2.1 左侧安装包拖入右侧文件夹中,等待安装完成,运行软件…...
网络技术-VRRP(虚拟路由冗余协议)部署介绍
一、VRRP的含义 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种高度可靠的路由器备用协议,用于在局域网内部提供路由器冗余。 其部署方式主要是通过多个路由器组成一个虚拟路由器组,通过协议选…...
C语言解决空瓶换水问题:高效算法与实现
标题:C语言解决空瓶换水问题:高效算法与实现 一、问题描述 在一个饮料促销活动中,你可以通过空瓶换水的方式免费获得更多的水:3个空瓶可以换1瓶水。喝完这瓶水后,空瓶会再次变为空瓶。假设你最初拥有一定数量的空瓶&a…...
day2全局注册
全局注册代码: //文件核心作用:导入App.vue,基于App.vue创建结构渲染index.htmlimport Vue from vue import App from ./App.vue //编写导入的代码,往代码的顶部编写(规范) import HmButton from ./components/Hm-But…...
鸿蒙多线程应用-taskPool
并发模型 并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。 Actor并发模型作为基于消息通信并发模型的典型代表,不需要开发者去面对锁带来的一系列复杂偶发的问题,同…...
【失败经验】将算法模型封装为安卓应用
背景:不懂安卓开发,希望能使用大模型编码完成安卓应用生成,调用算法模型进行预测。 模型准备: pip方案安装pcnn; 然后需要将pytorch训练完成的算法模型保存为torchscript模型,然后使用pcnn转换为ncnn的模…...
黄石建设工程信息网/暴风seo论坛
1. 无地形的贴地 2. 有地形的贴地 1. 无地形的“贴地” Cesium在创建Viewer视景器对象时,当我们将terrainProvier属性指定为EllipsoidTerrainProviderd对象时,那么就对应无地形的三维场景这种情况了, const viewer = new Cesium(targetID,{...,terrainProvider: new Cesiu…...
网站关键词可以做几个/搜索排名提升
datanucleus吨 他的开源项目DataNucleus将发布访问平台2.0日程提前一天。 他们的符合标准的Java持久性产品可使用多种API和多种查询语言,将数据检索到一系列数据存储中。 2.0版引入了对特定于数据存储的查询汇编和新JPA2映射的缓存的支持,并支持一些新的…...
丹阳网站建设要多少钱/百度seo课程
你好,我是黑泪。最近在逛全球最大交友网站Github时,无意中发现了一个“宝库”:hivemind[1],短短时间内已经积攒了840多个🌟,这个仓库可以实现“跨网络Pytorch分布式训练”。简单来说,它可以实现…...
网站管理难做吗/如何快速推广自己的产品
正则化(Regularization) 深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取…...
青海网站制作哪家好/软文范例200字
1. app项目下 ionic setup sass “第一次clone一个项目要编译一次sass” 2. git checkout . “返回到修改之前” 3. git status “查看状态” 4. git diff "如果个别不清楚的文件有修改,可以查看修改内容" 5. git checkout -A “切换到分支A” 6. rm -rf …...
做网站外包的公司好干嘛/企业网络营销顾问
我们看一个跨库事务一致性的问题,这是一个简单的场景:有新老两个系统,对应新老两套数据库,新数据库采用分库分表的设计,考虑到项目发布之后可能存在风险,采取了新老系统的并行方案。这个系统的业务比较简单…...