Python使用graphviz绘制模块间数据流

graphviz官方参考链接:
http://www.graphviz.org/documentation/
https://graphviz.readthedocs.io/en/stable/index.html


文章目录

    • 需求描述
    • 环境配置
    • 实现思路
    • 代码实现


需求描述

根据各模块之间的传参关系绘制出数据流,如下图所示:
在这里插入图片描述
并且生成对应的graphviz代码:

digraph my_graph {Input [fillcolor=gray70 shape=box style=filled]Output [fillcolor=gray70 shape=box style=filled]NodeANodeBNodeCInput -> NodeA [label=0]Input -> NodeA [label=1]NodeA -> NodeB [label=0]NodeA -> NodeC [label=1]NodeB -> Output [label=0]NodeC -> Output [label=0]
}

环境配置

  • 安装Python中需要使用的graphviz包:
pip install graphviz
  • 安装graphviz工具(可选,如果不安装无法直接使用Python的graphviz包导出图片),例如ubuntu系统安装指令如下,其他系统可参考官方文档https://www.graphviz.org/download/:
sudo apt install graphviz
  • VSCODE安装Graphviz Interactive Preview插件(可选,如果使用vscode开发建议安装此插件,通过此插件可以直接可视化graphviz代码,并保存图片)
    在这里插入图片描述

实现思路

实现一个Node基类,所有的模块实现都继承自该基类。再实现一个Message基类,模块之间传递的数据都继承自该基类。然后在数据传递过程中记录流经的每个模块的名称以及数据的传递方向即可绘制出想要的数据流。


代码实现

下面给出了一个简易的实现方式:

import os
from graphviz import Digraph__graph_dict__ = {}class Message:def __init__(self, node_name: str, idx: int):self.node_name = node_nameself.idx = idxclass EdgeInfo:def __init__(self, start_node_name: str, end_node_name: str, label: str) -> None:self.start_node_name = start_node_nameself.end_node_name = end_node_nameself.label = labeldef __str__(self):return f'{self.start_node_name} -> {self.end_node_name} [label="{self.label}"];'class Node:input_num: intoutput_num: intnode_name: strdef __call__(self, *args):global __graph_dict__assert len(args) == self.input_numif self.node_name not in __graph_dict__:__graph_dict__[self.node_name] = []for input_ in args:__graph_dict__[input_.node_name].append(EdgeInfo(input_.node_name,self.node_name,str(input_.idx)))res = tuple(Message(self.node_name, i) for i in range(self.output_num))if self.output_num == 1:return res[0]return resdef export_graphviz(graph, num_input: int, save_path: str):base_name = os.path.basename(save_path)name, _ = base_name.split(".")global __graph_dict____graph_dict__.clear()__graph_dict__.update({"Input": [], "Output": []})# infer and collect flow infoinput_args = tuple(Message("Input", i) for i in range(num_input))outputs = graph(*input_args)for ouput_ in outputs:if ouput_.node_name not in __graph_dict__:__graph_dict__[ouput_.node_name] = []__graph_dict__[ouput_.node_name].append(EdgeInfo(ouput_.node_name,"Output",str(ouput_.idx)))# create graph codedigraph = Digraph(name=name, format="jpg")# add nodeskeys = list(__graph_dict__.keys())for k in keys:if k in ["Input", "Output"]:digraph.node(k, **{"shape": "box", "style": "filled", "fillcolor": "gray70"})else:digraph.node(k)# add edgesfor k in keys:for edge_info in __graph_dict__[k]:digraph.edge(edge_info.start_node_name,edge_info.end_node_name,edge_info.label)# print digraph codeprint(digraph.source)# export gv and jpg filetry:digraph.render(directory=os.path.dirname(save_path))except Exception as e:print(f"export digraph failed, {e}")class NodeA(Node):def __init__(self):self.input_num = 2self.output_num = 2self.node_name = "NodeA"class NodeB(Node):def __init__(self):self.input_num = 1self.output_num = 1self.node_name = "NodeB"class NodeC(Node):def __init__(self):self.input_num = 1self.output_num = 1self.node_name = "NodeC"class Graph:def __init__(self):self.node_a = NodeA()self.node_b = NodeB()self.node_c = NodeC()def __call__(self, x0, x1):y0, y1 = self.node_a(x0, x1)z0 = self.node_b(y0)z1 = self.node_c(y1)return z0, z1if __name__ == "__main__":graph = Graph()export_graphviz(graph, num_input=2, save_path="./my_graph.gv")

执行上述代码后会生成my_graph.gv以及my_graph.gv.jpg两个文件(如果没有安装graphviz工具是不会生成的),其中my_graph.gv是graphviz的代码形式,my_graph.gv.jpg是可视化后的结果。

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

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

相关文章

【SpringBoot】SpringBoot 项目初始化方法

github 搜索 springboot 模板 github 搜索 springboot 模板,拉取现成代码。 SpringBoot 官方的模板生成器 SpringBoot 官方的模板生成器(https://start.spring.io/) 在 IDEA 开发工具中生成 这里我修改成阿里的镜像主要是要使用 Java8。 …

YOLOv8 更换主干网络之 HGNetV2

论文地址:https://arxiv.org/abs/2304.08069 代码地址:https://github.com/PaddlePaddle/PaddleDetection 中文翻译:https://blog.csdn.net/weixin_43694096/article/details/131353118 YOLOv8 更换方式 YOLOv8 想用这个主干直接换就行了,因为项目里面已经集成了,写一个…

[python]使用pyqt5搭建yolov8钢筋计数一次性钢材计数系统

【官方框架地址】 github地址:https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8是一种先进的深度学习模型,用于目标检测和识别。在钢筋计数任务中,Yolov8可以有效地识别和计数图像中的钢筋。下面是对如何使用Yolov8实现钢筋…

【嵌入式移植】4、U-Boot源码分析1—Makefile

U-Boot源码分析1—Makefile 1 分析思路2 u-boot源码目录结构3 Makefile源码3.1 版本号3.2 环境变量3.3 Beautify output3.4 输出文件的目录设置、PHONY目标3.6 目录信息3.5 Source Code Checker3.7 设置单独编译模块、PHONY目标3.8 获取宿主机的架构和系统3.9 设置交叉编译工具…

一个非常流行的R语言调色板:RColorBrewer

R 语言有许多非常优秀的调色板,本文就介绍一个非常流行的,我也经常在用的调色板 R 包:RColorBrewer。 安装 install.packages("RColorBrewer") 加载 library(RColorBrewer) library(knitr) 初探 ?RColorBrewer 在帮助页面可以看到…

Python实现单因素方差分析

Python实现单因素方差分析 1.背景 正念越来越受到人们关注,正念是一种有意的、不加评判的对当下的注意觉察。可以通过可以通过观呼吸、身体扫描、正念饮食等多种方式培养。 为了验证正念对记忆力的影响,选取三组被试分别进行正念训练,运动训…

使用STM32的UART实现蓝牙通信

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!&#x1f447…

解密.dataru被困的数据:如何应对.dataru勒索病毒威胁

导言: 在数字时代,勒索病毒如.dataru正在不断演变,威胁着用户的数据安全。本文91数据恢复将深入介绍.dataru勒索病毒的特点、被加密数据的恢复方法,以及预防措施,帮助您更好地了解并对抗这一数字威胁。当面对被勒索病…

基于SpringBoot的在线问卷调查管理系统

基于SpringBoot的在线问卷调查管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台主页 问卷列表 问卷详情 管理员界面 摘要 基于Spring Boot的在线问卷调…

JVM篇--垃圾回收器高频面试题

1 你知道哪几种垃圾收集器,各自的优缺点是啥,重点讲下cms和G1,包括原理,流程,优缺点? 1)首先简单介绍下 有以下这些垃圾回收器 Serial收集器: 单线程的收集器,收集垃圾时…

云贝教育 |【OceanBase】OBCA认证考试预约流程

一、OBCA账号登录/注册,链接 https://www.oceanbase.com/ob/login/mobile?gotohttps%3A%2F%2Fwww.oceanbase.com%2Ftraining%2Fdetail%3Flevel%3DOBCA 注册完之后,请点击右上“登录”进行实名认证 OBCA考试报名链接:https://www.oceanbase.…

stm32cubemx下载以及安装【最新版本傻瓜式教程】

一、官网 https://www.st.com/zh/development-tools/stm32cubemx.html 二、下载【废话不多说,按照图示所圈进行】 没有登录账号的建议先注册登录再进行下载,这样省去后面认证的麻烦。 选择自己电脑对应环境的版本,我的是windows11&#xf…

MSE Nacos:解决敏感配置的安全隐患

作者:察溯 前言 Nacos 简介 Nacos [ 1] 是一个更易于构建云原生应用的配置管理和服务管理平台。Nacos 的配置中心具有众多优势:动态实时更新配置、支持水平扩展的高可用系统架构、API 简单易上手、开源免费、多语言支持、集成度高等。基于以上特点&am…

Html+Css+JavaScript实现完整的轮播图功能

概要 这个案例具备常见轮播图完整的功能,大家可以根据自己的需求去修改; 代码可以直接复制运行,需要安装sass 主要功能: (1)鼠标移入轮播图,左右两边的按钮出现,离开则隐藏按钮&a…

proteus8.15安装教程

proteus8.15安装教程 1.管理员运行 2.一直NEXT到这一步,需要注意,一定要选这一个 3.选中后出现 4.一直下一步到更新 这边结束后准备激活: 1.安装激活插件,先关闭防火墙 2.下一步 3.最后,将数据库放在根目录下 …

从零开始配置pwn环境:sublime配置并解决pwn脚本报错问题

1.sublime安装 Download - Sublime Text ──(holyeyes㉿kali2023)-[~] └─$ sudo dpkg -i sublime-text_build-4169_amd64.deb [sudo] password for holyeyes: Selecting previously unselected package sublime-text. (Reading database ... 409163 files and directori…

huggingface学习 | 云服务器使用hf_hub_download下载huggingface上的模型文件

系列文章目录 huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件 文章目录 系列文章目录一、hf_hub_download介绍二、找到需要下载的huggingface文件三、准备工作及下载过程四、全部代码 一、hf_hub_download介绍 hf_hub_download是huggingface官方支持&…

力扣【四数之和】

一、题目描述 18. 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复&#x…

大数据开发之电商数仓(hadoop、flume、hive、hdfs、zookeeper、kafka)

第 1 章:数据仓库 1.1 数据仓库概述 1.1.1 数据仓库概念 1、数据仓库概念: 为企业制定决策,提供数据支持的集合。通过对数据仓库中数据的分析,可以帮助企业,改进业务流程、控制成本,提高产品质量。 数据…

C#中chart控件

C#中chart控件 图表的5大集合 例子 第一步:创建工程 放入chart控件 series集合 选择图标类型 选择绘制曲线的宽度和颜色。 显示数据标签 Title集合 添加标题 调整标题字体:大小和颜色 CharsArea集合 对坐标轴进行说明 设置间隔 设置刻度…