Ubuntu下的Graphviz的基础使用方法

news2025/1/14 18:21:13

一、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)图的样式定义修改

同样我们继续完善上面的例子,对整个图的样式进行定义,添加graphnode 关键字

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;
    # 这是一个以#开头的注释
}

这里有一篇详细一点的介绍,点这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…

#渗透测试#红蓝攻防#HW#经验分享#溯源反制

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅 目录 一、溯源反制 1、溯源反制的重要性 2、溯源…

Level DB --- SkipList

class SkipList class SkipList 是Level DB中的重要数据结构,存储在memtable中的数据通过SkipList来存储和检索数据,它有优秀的读写性能,且和红黑树相比,更适合多线程的操作。 SkipList SkipList还是一个比较简单的数据结构&a…

YOLOv11融合PIDNet中的PagFM模块及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2…

跨平台应用开发框架(4)-----Qt(样式篇)

目录 1.QSS 1.基本语法 2.QSS设置方式 1.指定控件样式设置 2.全局样式设置 1.样式的层叠特性 2.样式的优先级 3.从文件加载样式表 4.使用Qt Designer编辑样式 3.选择器 1.类型选择器 2.id选择器 3.并集选择器 4.子控件选择器 5.伪类选择器 4.样式属性 1.盒模型 …

uniapp定义new plus.nativeObj.View实现APP端全局弹窗

为什么要用new plus.nativeObj.View在APP端实现弹窗?因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填,会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…

使用phpStudy小皮面板模拟后端服务器,搭建H5网站运行生产环境

一.下载安装小皮 小皮面板官网下载网址:小皮面板(phpstudy) - 让天下没有难配的服务器环境! 安装说明(特别注意) 1. 安装路径不能包含“中文”或者“空格”,否则会报错(例如错误提示:Cant cha…

Qwen2.5-7B大模型微调记录

Qwen2.5-7B大模型微调记录 研究需要,需要搞一个大模型出来,没有太多的时间自己训练,准备用现成的开源大模型,然后结合研究方向进行微调 前前后后折腾大半个月,总算做完了第一个微调的大模型,模型基于阿里…

VUE_使用el.animate实现自定义指令抖动效果

// 在 Vue 2 中注册自定义指令 Vue.directive(shake,{// 当被绑定的元素插入到 DOM 中时inserted(el, binding){let value binding.valueconsole.log(el, binding)// 设置 transform-origin 样式el.style.transformOrigin center bottom;const keyframes [{ transform: rota…

多级反馈队列调度算法

参考一 多级反馈队列调度算法 背景/需求分析 在科学技术迅速发展的当代以及经济发展的需求,服务器和任务的数量都在高速增长,同时资源调度的方式以及数量也在成倍增长,目前存在的多种调度算法中,有的调度算法有利于长作业,有的有利于短作业…

ShuffleNet:一种为移动设备设计的极致高效的卷积神经网络

摘要 https://arxiv.org/pdf/1707.01083 我们介绍了一种名为ShuffleNet的计算效率极高的卷积神经网络(CNN)架构,该架构专为计算能力非常有限的移动设备(例如10-150 MFLOPs)而设计。新架构利用两种新操作:逐…

C++ 类和对象(类型转换、static成员)

目录 一、前言 二、正文 1.隐式类型转换 1.1隐式类型转换的使用 2.static成员 2.1 static 成员的使用 2.1.1static修辞成员变量 2.1.2 static修辞成员函数 三、结语 一、前言 大家好,我们又见面了。昨天我们已经分享了初始化列表:https://blog.c…

# DBeaver 连接hive数仓

前提 前提是基于hadoop的hive服务已经启动,其中hive的服务包括metastore元数据服务和hiveserver2服务已经启动。hiveserver2服务在默认端口10000启动,且通过telnet xx.xx.xx.xx 10000 能通。 满足以上要求后,再可以看以下连接文档&#xff…

C++趣味编程玩转物联网:用树莓派Pico控制四位数码管

数码管是一种常用的数字显示器件,广泛应用于电子时钟、记分牌和智能设备显示界面。在本项目中,我们将通过树莓派Pico板控制一个四位数码管模块,展示从 0000 到 9999 的数字动态显示。这不仅是一次硬件和软件结合的实践,还可以帮助…

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

2024年11月27日Github流行趋势

项目名称:screenshot-to-code 项目维护者:abi clean99 sweep-ai kachbit vagusX项目介绍:通过上传截图将其转换为整洁的代码(支持HTML/Tailwind/React/Vue)。项目star数:62,429项目fork数:7,614…

K8s调度器扩展(scheduler)

1.K8S调度器 筛选插件扩展 为了熟悉 K8S调度器扩展步骤,目前只修改 筛选 插件 准备环境(到GitHub直接下载压缩包,然后解压,解压要在Linux系统下完成) 2. 编写调度器插件代码 在 Kubernetes 源代码目录下编写调度插件…

Qt桌面应用开发 第七天(绘图事件 绘图设备)

目录 1.绘图事件paintEvent 2.高级绘图 3.图片绘制 4.绘图设备 4.1QPixmap 4.2QBitmap 4.3QImage 4.4QPicture 1.绘图事件paintEvent paintEvent——绘图事件 需求:利用QPainter绘制点、线、圆、矩形、文字;设置画笔改为红色,宽度为…

Spring Boot 3 集成 Spring Security(3)数据管理

文章目录 准备工作新建项目引入MyBatis-Plus依赖创建表结构生成基础代码 逻辑实现application.yml配置SecurityConfig 配置自定义 UserDetailsService创建测试 启动测试 在前面的文章中我们介绍了 《Spring Boot 3 集成 Spring Security(1)认证》和 《…

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…