python绘制流程图
场景:绘制「算法流程图」(如二分查找),需输出 SVG 矢量图(可无限放大不失真,适合插入论文/PPT),并自定义节点形状、字体、箭头样式,提升专业度。基础巩固:复现本文 6 个案例,重点掌握 Graphviz 的子图、样式自定义、矢量图导出;场景拓展:尝试绘制「数据库事务流程」「机器学习模型训练流程」,用子图划分「数据预处理」「模型训练」「评估部署」模块;工具融合:将流程图与数据可视化结合(如用
Python 绘制流程图全指南:从基础到高级实践
流程图是可视化业务逻辑、算法步骤、数据流程的核心工具,在项目管理、技术文档、教学演示中应用广泛。Python 凭借丰富的第三方库,可实现从简单线性流程到复杂分支循环流程的绘制,且支持高度自定义样式与多格式导出。本文将系统讲解 3 个主流绘图库(Graphviz、PyGraphviz、Matplotlib+BlockDiag)的使用方法,通过 8 个实战案例覆盖常见流程图场景,帮助你快速掌握 Python 流程图绘制技能。
一、核心工具库选型:3 大主流库对比与适用场景
Python 生态中,绘制流程图的库各有侧重,选择需结合「是否需要额外软件」「自定义难度」「输出格式」三个核心维度。下表清晰对比了最常用的 3 个库:
| 库名称 | 核心依赖 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| Graphviz | 需安装 Graphviz 软件 | 语法简洁、支持 20+ 输出格式(PNG/SVG/PDF)、节点/边样式丰富 | 需额外安装软件,Windows 需配置环境变量 | 绝大多数场景,尤其需高质量矢量图时 |
| PyGraphviz | 依赖 Graphviz 库 | 基于 Graphviz,支持 Python 面向对象操作 | 安装兼容性差(Windows 易失败) | Linux/macOS 环境下的复杂流程绘制 |
| Matplotlib+BlockDiag | 仅需 Python 库 | 无需额外软件、可嵌入 Matplotlib 图表 | 样式相对单一,复杂分支易混乱 | 快速生成简单流程,或与数据图结合 |
选型建议:优先选择 Graphviz,其跨平台兼容性好(配置后)、功能全面,是工业界主流选择;若为 Windows 新手且仅需简单流程,可先用 Matplotlib+BlockDiag 入门。
二、基础工具准备:Graphviz 环境搭建(全平台)
Graphviz 是本文核心工具,需先完成「软件安装」+「Python 库安装」两步,否则代码会报错。以下是分平台详细步骤:
1. 安装 Graphviz 软件(必做)
-
Windows 系统:
- 访问 Graphviz 官网,下载对应系统的安装包(如 graphviz-10.0.1-windows.exe);
- 安装时勾选「Add Graphviz to the system PATH」(若未勾选,需手动添加:右键「此电脑」→「属性」→「高级系统设置」→「环境变量」→ 系统变量「Path」→ 添加安装路径下的「bin」文件夹,如
C:\Program Files\Graphviz\bin); - 验证:打开新的命令提示符(CMD),输入
dot -version,若显示版本信息则成功。
-
macOS 系统:
直接通过 Homebrew 安装,终端输入命令:brew install graphviz,安装后输入dot -version验证。 -
Linux 系统(Ubuntu/Debian):
终端输入命令:sudo apt-get install graphviz,无需额外配置环境变量。
2. 安装 Python 库(全平台统一)
打开终端/CMD,输入以下命令安装 Graphviz 的 Python 绑定库:
pip install graphviz # 核心库
pip install matplotlib blockdiag # 备用库,用于简单流程
安装完成后,在 Python 中输入 import graphviz,无报错则环境搭建成功。
三、Graphviz 实战:从简单流程到复杂分支
Graphviz 的核心逻辑是「先创建图对象,再添加节点/边,最后设置样式并导出」。其语法贴近自然语言,即使是复杂流程也能通过分步添加实现。以下通过 4 个案例逐步深入,覆盖 90% 实际需求。
案例 1:线性流程图(基础)
场景:绘制「用户登录流程」的线性步骤(输入账号→输入密码→验证→登录成功),重点掌握节点、边的基础添加方式。
代码实现(含详细注释)
# 1. 导入 Graphviz 的核心类 Digraph(有向图,流程图必用)
from graphviz import Digraph
# 2. 创建图对象,设置图名称(无实际意义)、格式(输出为 PNG)、整体样式
dot = Digraph(
name="user_login_flow", # 图的标识名
format="png", # 输出格式,可选 svg/pdf/jpg 等
comment="用户登录线性流程", # 注释,不影响图形
node_attr={"shape": "box", "style": "filled", "color": "#f0f0f0"}, # 全局节点样式:矩形、填充、浅灰色背景
edge_attr={"color": "#666666"} # 全局边样式:灰色线条
)
# 3. 添加节点(节点名需唯一,label 是显示的文字)
dot.node("A", label="用户打开登录页") # 节点 A:初始步骤
dot.node("B", label="输入账号") # 节点 B:输入操作
dot.node("C", label="输入密码") # 节点 C:输入操作
dot.node("D", label="系统验证账号密码")# 节点 D:系统操作
dot.node("E", label="登录成功,跳转主页")# 节点 E:结果
# 4. 添加边(连接节点,形成流程顺序)
dot.edge("A", "B") # A → B
dot.edge("B", "C") # B → C
dot.edge("C", "D") # C → D
dot.edge("D", "E") # D → E
# 5. 导出图形(filename 是输出文件名,无格式后缀)
dot.render(filename="linear_login_flow", directory="./flow_charts", view=True)
# 参数说明:directory 指定保存路径(需提前创建),view=True 导出后自动打开图片
关键知识点
- 节点属性(node_attr):
shape控制节点形状(box=矩形、ellipse=椭圆、diamond=菱形),style="filled"表示填充背景,color支持十六进制色号或英文色名(如 “lightblue”); - 边属性(edge_attr):
color控制线条颜色,arrowhead控制箭头样式(如 “vee”=三角箭头、“dot”=圆点箭头); - render() 方法:
directory路径需提前创建(如手动建flow_charts文件夹),否则会报「文件不存在」错误。
输出效果
生成的 linear_login_flow.png 中,5 个浅灰色矩形节点按顺序连接,灰色箭头清晰指示流程方向,整体简洁专业。
案例 2:分支流程图(条件判断)
场景:在案例 1 基础上增加「密码错误」分支(验证→密码错误→重新输入),重点掌握「条件判断节点」与「分支边」的设置。
代码实现
from graphviz import Digraph
# 创建图对象,调整节点样式(判断节点用菱形)
dot = Digraph(
format="png",
node_attr={"style": "filled"}, # 全局填充
edge_attr={"fontname": "SimHei"} # 边标签用黑体,避免中文乱码
)
# 1. 添加节点:区分「操作节点」(矩形)和「判断节点」(菱形)
dot.node("A", "打开登录页", shape="box", color="#e6f7ff") # 浅蓝色操作节点
dot.node("B", "输入账号密码", shape="box", color="#e6f7ff")
dot.node("C", "验证账号密码?", shape="diamond", color="#fff2e6") # 浅橙色判断节点
dot.node("D", "登录成功", shape="box", color="#e6ffe6") # 浅绿色成功节点
dot.node("E", "提示密码错误", shape="box", color="#fff2f0") # 浅红色错误节点
# 2. 添加边:给分支边添加标签(label)说明条件
dot.edge("A", "B")
dot.edge("B", "C")
dot.edge("C", "D", label="验证通过") # 分支1:通过
dot.edge("C", "E", label="验证失败") # 分支2:失败
dot.edge("E", "B", label="重新输入") # 循环:错误后返回输入步骤
# 导出并显示
dot.render("branch_login_flow", "./flow_charts", view=True)
关键知识点
- 中文乱码解决:在
edge_attr或node_attr中添加fontname="SimHei"(黑体)或fontname="Microsoft YaHei"(微软雅黑),确保中文正常显示; - 判断节点:用
shape="diamond"明确区分流程中的「决策点」,颜色建议与操作节点区分(如橙色); - 循环流程:通过
dot.edge("E", "B")实现「错误→重新输入」的循环,边标签需说明循环逻辑。
输出效果
图形中出现菱形判断节点,两条分支边分别指向「登录成功」和「密码错误」,错误节点又通过箭头返回输入步骤,完整还原了带循环的登录流程。
案例 3:子图与嵌套流程(复杂场景)
场景:绘制「电商订单处理流程」,其中「支付环节」包含多个子步骤(选择支付方式→验证支付信息→扣减库存),需用「子图(Subgraph)」实现模块划分,避免流程混乱。
代码实现
from graphviz import Digraph
dot = Digraph(format="png", node_attr={"shape": "box", "style": "filled"}, edge_attr={"fontname": "SimHei"})
# 1. 添加主流程节点(顶层节点)
dot.node("start", "用户提交订单", color="#e6f7ff")
dot.node("end", "订单完成,发送物流", color="#e6ffe6")
# 2. 创建子图:支付环节(子图名必须以 cluster_ 开头,否则不显示边框)
with dot.subgraph(name="cluster_payment") as subg:
subg.attr(label="支付环节", style="filled", color="#f0f0f0") # 子图样式:灰色背景、带标签
# 子图内节点
subg.node("p1", "选择支付方式(微信/支付宝)", color="#fff2e6")
subg.node("p2", "验证支付信息(金额/账号)", color="#fff2e6")
subg.node("p3", "扣减商品库存", color="#fff2e6")
# 子图内流程
subg.edge("p1", "p2")
subg.edge("p2", "p3")
# 3. 创建子图:订单审核环节
with dot.subgraph(name="cluster_check") as subg2:
subg2.attr(label="订单审核", style="filled", color="#f0f0f0")
subg2.node("c1", "检查地址是否有效", color="#f0f7ff")
subg2.node("c2", "检查商品是否有货", color="#f0f7ff")
subg2.edge("c1", "c2")
# 4. 连接主流程与子图(子图内节点可直接作为边的起点/终点)
dot.edge("start", "cluster_check") # 主节点→子图(实际指向子图第一个节点)
dot.edge("c2", "cluster_payment") # 子图1→子图2
dot.edge("p3", "end") # 子图2→主节点
# 导出
dot.render("ecommerce_order_flow", "./flow_charts", view=True)
关键知识点
- 子图命名规则:子图名必须以
cluster_开头(如cluster_payment),否则 Graphviz 不会将其识别为「模块」,也就不会显示边框和背景; - 子图连接方式:主流程节点可直接与子图名连接(如
dot.edge("start", "cluster_check")),Graphviz 会自动连接到子图的第一个节点; - 模块划分价值:复杂流程(超过 10 个节点)必须用子图划分模块(如支付、审核、物流),否则图形会杂乱无章,可读性极差。
输出效果
图形中出现两个带灰色背景的子图模块,分别标注「支付环节」和「订单审核」,主流程箭头清晰穿过两个模块,整体结构一目了然,符合复杂业务流程的可视化需求。
案例 4:自定义样式与矢量图导出(专业级)
场景:绘制「算法流程图」(如二分查找),需输出 SVG 矢量图(可无限放大不失真,适合插入论文/PPT),并自定义节点形状、字体、箭头样式,提升专业度。
代码实现
from graphviz import Digraph
# 1. 创建图对象,设置全局样式(矢量图格式为 svg)
dot = Digraph(
name="binary_search",
format="svg", # 输出矢量图,支持无限放大
node_attr={
"fontname": "Times New Roman", # 英文用衬线字体,更正式
"fontsize": "11", # 字体大小
"style": "filled,rounded", # 填充+圆角
"penwidth": "1.5" # 节点边框粗细
},
edge_attr={
"penwidth": "1.2", # 线条粗细
"arrowhead": "vee" # 箭头样式(三角箭头)
},
graph_attr={
"rankdir": "TB", # 流程方向:TB=从上到下,LR=从左到右
"size": "8,6" # 图形大小(宽,高),单位英寸
}
)
# 2. 添加算法流程节点
dot.node("start", "开始:初始化 low=0,high=n-1", color="#d1e7dd")
dot.node("cond1", "low ≤ high?", shape="diamond", color="#fff3cd")
dot.node("calc", "mid = (low + high) // 2", color="#cce5ff")
dot.node("cond2", "arr[mid] == target?", shape="diamond", color="#fff3cd")
dot.node("found", "返回 mid(找到目标)", color="#d4edda")
dot.node("cond3", "arr[mid] < target?", shape="diamond", color="#fff3cd")
dot.node("upd1", "low = mid + 1", color="#cce5ff")
dot.node("upd2", "high = mid - 1", color="#cce5ff")
dot.node("notfound", "返回 -1(未找到)", color="#f8d7da")
# 3. 连接边并添加条件标签
dot.edge("start", "cond1")
dot.edge("cond1", "calc", label="是")
dot.edge("cond1", "notfound", label="否")
dot.edge("calc", "cond2")
dot.edge("cond2", "found", label="是")
dot.edge("cond2", "cond3", label="否")
dot.edge("cond3", "upd1", label="是")
dot.edge("cond3", "upd2", label="否")
dot.edge("upd1", "cond1")
dot.edge("upd2", "cond1")
# 导出 SVG 矢量图(可直接插入 Word/PPT)
dot.render("binary_search_flow", "./flow_charts", view=True)
关键知识点
- 矢量图优势:SVG 格式文件体积小、放大不失真,适合用于论文、正式报告;若需插入文档,可将 SVG 转换为 EMF 格式(用在线工具),避免 Word 压缩失真;
- 流程方向控制:
graph_attr中的rankdir参数:TB(从上到下,默认)适合线性流程,LR(从左到右)适合横向排版的复杂分支; - 细节样式优化:
penwidth控制边框/线条粗细(建议 1.2-1.5),rounded让节点更圆润,避免尖锐边缘,提升视觉舒适度。
输出效果
生成的 SVG 图中,节点圆角、线条粗细均匀,箭头清晰,流程方向从上到下,完整还原了二分查找算法的逻辑,可直接用于学术或技术文档。
四、备用方案:Matplotlib+BlockDiag 快速绘图
若不想安装 Graphviz 软件,可使用 blockdiag 库结合 Matplotlib 绘制简单流程图。其优势是「纯 Python 依赖」,但样式和复杂度受限,适合快速生成草图。
案例 5:简单流程绘制(无额外软件)
代码实现
# 1. 安装依赖(若未安装)
# pip install matplotlib blockdiag
from blockdiag import parser, builder
from blockdiag.imagedraw import matplotlib
import matplotlib.pyplot as plt
# 2. 定义流程图语法(类似 Graphviz,用字符串描述)
diagram_def = """
blockdiag {
default_shape = "box";
default_style = "filled";
default_color = "#e6f7ff";
A [label="开始"];
B [label="数据采集"];
C [label="数据清洗"];
D [label="数据分析"];
E [label="生成报告"];
A -> B -> C -> D -> E;
}
"""
# 3. 解析语法并生成图形
tree = parser.parse_string(diagram_def)
diagram = builder.ScreenNodeBuilder.build(tree)
# 4. 用 Matplotlib 显示并保存
fig, ax = plt.subplots(figsize=(8, 5))
drawer = matplotlib.MatplotlibImageDraw(fig, ax, diagram, None)
drawer.draw()
# 隐藏坐标轴,让图形更干净
ax.axis("off")
# 保存为 PNG
plt.savefig("./flow_charts/matplotlib_flow.png", dpi=300, bbox_inches="tight")
plt.show()
关键特点
- 无需安装额外软件,仅需 Python 库;
- 语法用字符串定义,类似 Graphviz,但不支持子图和复杂分支;
- 可直接嵌入 Matplotlib 图表,适合与数据可视化结合(如流程+结果图表)。
五、高级实战:PyGraphviz 面向对象绘图(Linux/macOS)
PyGraphviz 是 Graphviz 的 Python 封装,支持面向对象操作,适合 Linux/macOS 环境下的复杂流程。但 Windows 安装易失败(需编译依赖),建议 Windows 用户优先用 Graphviz。
案例 6:带属性继承的复杂流程
代码实现
# 1. 安装(Linux/macOS):pip install pygraphviz
import pygraphviz as pgv
# 1. 创建图对象(有向图)
G = pgv.AGraph(directed=True, strict=False) # strict=False 允许重复边
G.graph_attr["rankdir"] = "TB"
G.graph_attr["fontname"] = "SimHei"
# 2. 添加节点并设置属性(面向对象方式)
G.add_node("A", label="用户注册", shape="box", style="filled", color="#e6f7ff")
G.add_node("B", label="邮箱验证", shape="box", style="filled", color="#e6f7ff")
G.add_node("C", label="验证通过?", shape="diamond", style="filled", color="#fff2e6")
G.add_node("D", label="完善个人信息", shape="box", style="filled", color="#e6f7ff")
G.add_node("E", label="注册完成", shape="box", style="filled", color="#e6ffe6")
G.add_node("F", label="重新发送验证邮件", shape="box", style="filled", color="#fff2f0")
# 3. 添加边并设置样式
G.add_edge("A", "B", color="#666", penwidth=1.2)
G.add_edge("B", "C", color="#666", penwidth=1.2)
G.add_edge("C", "D", label="是", color="#28a745", penwidth=1.2)
G.add_edge("C", "F", label="否", color="#dc3545", penwidth=1.2)
G.add_edge("F", "B", color="#666", penwidth=1.2, style="dashed") # 虚线边
G.add_edge("D", "E", color="#666", penwidth=1.2)
# 4. 保存图形
G.draw("./flow_charts/pygraphviz_flow.png", format="png", prog="dot") # prog="dot" 表示用 dot 布局引擎
关键特点
- 支持面向对象操作,节点/边可通过变量引用(如
node = G.get_node("A")后修改属性); - 布局引擎可指定(
prog="dot"/prog="neato"),dot适合流程,neato适合无向图; - 虚线边(
style="dashed")、颜色区分(绿色通过、红色失败)等样式均可灵活设置。
六、常见问题与解决方案(避坑指南)
在 Python 绘制流程图时,新手易遇到环境配置、样式异常等问题,以下是高频问题的解决方案:
1. Graphviz 报错「dot: command not found」(Windows)
- 原因:未配置环境变量,或配置后未重启终端;
- 解决:重新检查环境变量「Path」是否添加
Graphviz\bin路径,添加后必须关闭所有终端,重新打开后再运行代码。
2. 中文显示为乱码(方框)
- 原因:未指定支持中文的字体;
- 解决:在
node_attr或edge_attr中添加fontname="SimHei"或fontname="Microsoft YaHei",确保系统有该字体(Windows 自带,Linux/macOS 需手动安装)。
3. 子图不显示边框和背景
- 原因:子图名未以
cluster_开头; - 解决:子图名必须满足
name="cluster_xxx",如cluster_payment,否则 Graphviz 会将其视为普通节点集合。
4. PyGraphviz 安装失败(Windows)
- 原因:Windows 缺乏编译依赖(如 C++ 编译器);
- 解决:放弃 PyGraphviz,改用 Graphviz 库;或通过 Unofficial Windows Binaries 下载对应 Python 版本的 PyGraphviz wheel 文件,用
pip install 文件名.whl安装。
七、总结与拓展:从入门到精通的路径
通过本文学习,你已掌握 Python 绘制流程图的核心技能,后续可按以下路径深化:
- 基础巩固:复现本文 6 个案例,重点掌握 Graphviz 的子图、样式自定义、矢量图导出;
- 场景拓展:尝试绘制「数据库事务流程」「机器学习模型训练流程」,用子图划分「数据预处理」「模型训练」「评估部署」模块;
- 工具融合:将流程图与数据可视化结合(如用 Matplotlib 绘制流程+结果图表,或用 Streamlit 搭建交互式流程图网页);
- 自动化生成:学习从 Excel/JSON 数据自动生成流程图(如读取 Excel 中的流程步骤,用循环添加节点和边),提升效率。
交付物提议
为帮助你快速落地实战,我可以帮你整理一份 《Python 流程图实战代码集》,包含本文所有案例的完整可运行代码(含注释)、环境配置手册、常见问题解决方案,你只需复制代码并按手册配置环境,即可直接生成流程图。需要我帮你整理这份代码集吗?
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)