diagrams Custom 自定义节点指南:用任意图片快速绘制自定义架构图
diagrams Custom 自定义节点指南用任意图片快速绘制自定义架构图【免费下载链接】diagrams:art: Diagram as Code for prototyping cloud system architectures项目地址: https://gitcode.com/GitHub_Trending/di/diagramsdiagrams 是一个「图即代码」Diagram as Code开源项目你用几行 Python 就能画出云架构图。它的图标库覆盖了 AWS、Azure、GCP、Kubernetes 等主流组件但总有一些自研中间件、内部系统找不到对应图标。Custom 自定义节点就是为此设计的传入一张本地图片或网络下载的图片它就能作为节点图标出现在你的架构图里最终由 Graphviz 渲染成 PNG/SVG 等格式。什么时候需要 Custom 自定义节点内置节点库再全也覆盖不了你的业务组件。想象一下这些场景你的公司有一套自研消息总线图标库里根本没有它某个开源工具比如某品牌的 Broker、网关有官方 logo但 diagrams 还没收录你给团队画内部服务拓扑需要把「任务调度中心」「报表服务」这类业务系统画进图里。这时你不需要等上游收录diagrams.custom.Custom类允许你把任意一张图片直接作为节点图标缺口立刻补上。它和内置节点一样继承自Node能参与所有连线操作符所以和现成节点混用时毫无违和感。五分钟画出第一张自定义架构图先备齐运行环境三样东西缺一不可Python 3.7 以上当前版本声明为 ^3.9系统级的 Graphviz 程序macOS 用 Homebrew、Windows 用 Chocolatey 均可库本体pip install diagrams。假设你把图标放在./icons/目录下写一个最小脚本first_diagram.pyfrom diagrams import Diagram from diagrams.custom import Custom with Diagram(内部消息链路, showFalse, filenamefirst_diagram): gateway Custom(API 网关, ./icons/gateway.png) consumer Custom(消费服务, ./icons/consumer.png) gateway consumerpython first_diagram.py之后当前目录会多出一张first_diagram.png。就这么简单你已经画出了第一张含自定义图标的架构图。三个值得留意的细节showFalse表示只存图、不弹窗预览适合脚本化产出filename不带扩展名默认输出 png也可以用outformat换成 svg、pdf 等节点创建在with Diagram(...)块内这个约束后面排查报错时还会用到。原理一句话Custom把图标路径原样写进 Graphviz 节点的image属性同时给节点加上shapenone让图标取代默认方框标签里每多一个换行\n节点高度自动加 0.4避免文字和图标叠在一起。真正的图片读取发生在with块退出、Graphviz 开始渲染的那一刻——所以图标只要在渲染前存在于磁盘上就行。图标从哪来本地图片路径直接传给 Custom这是最直接的用法。图标已经在你机器上设计同事给的 logo、自己画的 png把相对或绝对路径作为第二个参数传进去即可from diagrams import Diagram, Cluster from diagrams.custom import Custom with Diagram(数据平台依赖, showFalse, filenamelocal_icons, directionLR): scheduler Custom(任务调度\n中心, ./icons/scheduler.png) with Cluster(计算层): workers [Custom(Worker, ./icons/worker.png) - Custom(Worker, ./icons/worker.png) - Custom(Worker, ./icons/worker.png)] storage Custom(对象存储, ./icons/storage.png) scheduler workers workers storage为什么强调路径打个比方你把文件放哪Graphviz 就去哪找它不会替你改路径。Custom不做任何路径拼接所以相对路径是相对于「你运行脚本时所在的目录」而不是脚本文件所在位置。把脚本拷到别处执行、或者在错误目录下跑图标就会静默消失——这是新手踩坑最多的地方。注意上面还顺带用了两种组合技巧Cluster把三个 Worker 框成一个分组-表示无向边三者对等而是带箭头的有向边。网络图片如何下载图标后再引用如果图标托管在网站上思路是「先下载成本地文件再交给Custom」。Custom本身不发任何网络请求网络下载只是把图标本地化的手段from urllib.request import urlretrieve from diagrams import Diagram from diagrams.custom import Custom # 先下载图标渲染前文件必须就位 urlretrieve(https://example.com/icons/rabbitmq.png, rabbitmq.png) urlretrieve(https://example.com/icons/consumer.png, consumer.png) with Diagram(远程图标示例, showFalse, filenameremote_icon): broker Custom(消息 Broker, rabbitmq.png) worker Custom(消费 Worker, consumer.png) broker worker怎么做调用urlretrieve(url, 文件名)把远程图片保存到当前目录然后把本地文件名传给Custom。为什么必须这样Graphviz 渲染时只认磁盘上的文件image属性里写一个 http 地址它不会去下载。注意什么下载动作要发生在渲染之前——放在with块之前如示例或块内、节点创建之前都可以若脚本提前结束、文件还没落盘图里对应的图标就会是空白。官方文档中的远程图标示例渲染效果类似下面这张用远程下载的图标拼出的节点架构让图更复杂分组、扇出和混用画到一定规模光靠两个节点连线不够用了。三个进阶手段按使用频率排序。用 Cluster 给节点分组with Cluster(分组名):块内的所有节点会被框进一个带标题的圆角矩形视觉上表达这些属于同一层/同一域。上面的计算层就是例子。官方示例里也常用它把对等节点圈在一起列表扇出与聚合连线算子支持列表能一行替代 N 行重复代码a b有向边a 指向 ba - b无向边无箭头a [n1, n2, n3]右侧是列表 扇出a 分别指向每个节点[n1, n2, n3] b左侧是列表 聚合每个节点分别指向 b。前面scheduler workers一个调度器连三个 Worker和workers storage三个 Worker 汇聚到存储正好就是扇出 聚合的完整拓扑两个表达式搞定。与内置节点自由混用Custom继承自Node和Pod、Aurora等内置节点地位相同可以无缝串进同一条连线链。比如自定义消息队列 → 三个 K8s Workerfrom diagrams import Diagram, Cluster from diagrams.custom import Custom from diagrams.k8s.compute import Pod with Diagram(自定义与内置节点混用, showFalse, filenamemixed): with Cluster(消费集群): consumers [Pod(worker), Pod(worker), Pod(worker)] queue Custom(消息队列, rabbitmq.png) queue consumersqueue consumers一次扇出三条边整张图里自定义图标和 Kubernetes 官方图标同台出现。官方文档的同类示例Broker Pod 消费集群渲染效果如下常见报错与排查遇到下面几种情况基本都能快速定位图标不显示其他都正常90% 是路径问题。Custom相对路径基于脚本运行目录试试在图标所在目录执行脚本或改用绝对路径确认。文件在磁盘上但路径拼错了Graphviz 不报错只是不画。EnvironmentError: Global diagrams context not set up节点跑到了with Diagram(...)块外面。Custom和所有节点一样必须在全局图上下文内创建把节点创建语句挪回with块里即可。ValueError: xxx is not a valid directiondirection只接受TB/BT/LR/RL四种取值对应 Graphviz 的 rankdiroutformat同理只认png/jpg/svg/pdf/dot。渲染完找不到.dot中间文件这是预期行为。Diagram在with块退出时渲染完图后会主动删除 Graphviz 中间文件只留下最终图片方便你直接分发产物。参数速查参数所属默认值说明nameDiagram图标题未指定filename时用它生成文件名filenameDiagram由name生成输出文件名不带扩展名directionDiagramLR布局方向TB/BT/LR/RLshowDiagramTrue渲染后是否打开图像预览outformatDiagrampng输出格式可传列表一次出多格式labelCustom必填节点标签\n换行每换一行节点高度 0.4icon_pathCustom必填图片路径原样传给 Graphviz相对运行目录一句话总结Custom 自定义节点是 diagrams 扩展图标库的标准入口一张本地图片直接传路径一张网络图片先urlretrieve落盘再传文件名之后它就和内置节点一样能分组、扇出、聚合、连线。想动手试试从官方文档 docs/nodes/custom.md 开始实现源码在 diagrams/custom/init.py更完整的组合玩法可继续翻 docs/getting-started/examples.md。【免费下载链接】diagrams:art: Diagram as Code for prototyping cloud system architectures项目地址: https://gitcode.com/GitHub_Trending/di/diagrams创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

深入解析 jQuery Treeview 树形插件:OpenEMR 中的嵌套列表树状导航实践

深入解析 jQuery Treeview 树形插件:OpenEMR 中的嵌套列表树状导航实践

医疗健康后端 【免费下载链接】openemr The most popular open source electronic health records and medical practice management solution. 项目地址: https://gitcode.com/GitHub_Trending/op/openemr 点击查看 免费下载 导读 本文围绕 OpenEMR 仓库中内置的…

2026/10/4 1:54:38 阅读更多 →
重装系统后C盘格式化文件恢复:原理、步骤与避坑指南

重装系统后C盘格式化文件恢复:原理、步骤与避坑指南

简介:这份docx文档专门面向重装系统后急需恢复C盘数据的用户,系统讲解格式化分区后文件的找回方法。内容以顶尖数据恢复软件的‘误格式化硬盘’功能为主线,分步介绍选择恢复模式、扫描被格式化盘符、识别并勾选所需文件、安全存放恢复数据等操…

2026/10/4 1:54:38 阅读更多 →
汇川AM402与H3U基于ModbusTCP的C#上位机通讯实战解析

汇川AM402与H3U基于ModbusTCP的C#上位机通讯实战解析

做工业上位机这些年,ModbusTCP 一直是我绕不开的话题。标题里“ModebusTcp”这个写法我在各种搜索记录里见过不少次,先说明一下,规范写法是 ModbusTCP,下文统一用这个。今天想聊的这套组合——汇川 AM402、H3U 和 C# 上位机走 Mod…

2026/10/4 1:54:37 阅读更多 →

最新新闻

统一管理54+AI编程工具的Agent技能:我如何构建技能中枢

统一管理54+AI编程工具的Agent技能:我如何构建技能中枢

1. 为什么需要这么个“技能中枢”:54工具下的碎片化困局先说我碰到的真实情况。去年开始,我的主力机里装了Cursor、Windsurf、Trae、Codex CLI、Cline、Continue、Zed,还有几个叫得上名的Agent框架,加起来十几个AI编程工具。每个工…

2026/10/4 5:55:07 阅读更多 →
Python读取Excel的底层原理与工程化实践

Python读取Excel的底层原理与工程化实践

1. 为什么“把Excel的数据导入Python”不是个简单操作,而是一道必须跨过的数据工程门槛?你刚在Excel里整理完销售报表,想用Python画个趋势图,结果卡在第一步:怎么把表格里的数字塞进Python?不是点几下鼠标就…

2026/10/4 5:55:07 阅读更多 →
OpenShell:Windows 开始菜单增强工具与 WSL 桌面桥接实践

OpenShell:Windows 开始菜单增强工具与 WSL 桌面桥接实践

1. OpenShell 是什么?它不是 Shell,也不是“开源 Shell”,更不是某个 Linux 发行版 OpenShell 这个名字在当前技术社区里确实容易引发第一层误解——听到“Shell”,下意识会联想到 bash、zsh、fish;看到“Open”&…

2026/10/4 5:55:07 阅读更多 →
Java双人联机小游戏源码解析:森林冰火人Socket通信与碰撞判定实战

Java双人联机小游戏源码解析:森林冰火人Socket通信与碰撞判定实战

简介:这是一份面向Java初学者与课程设计需求的「森林冰火人」双人联机小游戏源码,适合想通过完整项目练手、理解游戏开发基本流程的学生与自学者。资源围绕角色设计、地图搭建、移动跳跃与敌人AI等核心机制展开,可作为Java课设或小游戏开发的…

2026/10/4 5:55:07 阅读更多 →
OpenShell:跨平台终端前端统一开发体验

OpenShell:跨平台终端前端统一开发体验

1. OpenShell 是什么?它不是 Shell,而是一把“跨平台终端体验重构钥匙”OpenShell 这个名字乍一听容易让人误以为是某个 Linux 发行版的定制 shell(比如 bash、zsh 的变种),或者像 Oh My Zsh 那样的配置框架。但实际完…

2026/10/4 5:55:07 阅读更多 →
PNG编解码核心机制详解:从文件结构到滤波压缩算法

PNG编解码核心机制详解:从文件结构到滤波压缩算法

提到PNG编解码,很多人的第一反应是“这不是图像处理库早就封装好的东西吗”。但实际去碰底层的人才会发现,真到踩坑的时候,比如前端构建工具突然报出类似“failed to resolve import”这种崩溃,或者是自己在嵌入式设备上想用一张透…

2026/10/4 5:54:07 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →