用TikZ绘制专业流程图:从入门到进阶(基于D3QN训练流程)
用TikZ绘制专业流程图:从入门到进阶(基于D3QN训练流程)
本文以 d3qn_training_process.tex
为案例,系统讲解如何使用 TikZ 在 LaTeX 中绘制专业流程图。内容循序渐进,覆盖:环境配置、基础语法(节点、箭头、定位、样式)、完整实战复现(经验回放-采样-网络-TD误差-梯度-优先级-拷贝)、进阶技巧(fit/background/calc)、常见问题与导出方法。读完即可独立绘制清晰、美观、可复用的流程图。
一、准备工作与环境配置
推荐使用 standalone
文档类单独编译图形,方便导入论文/幻灯片:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usepackage{amsmath, amssymb, bm}
\usetikzlibrary{shapes,arrows,positioning,fit,backgrounds,calc}
- standalone:独立产出 PDF/PNG,迁移方便
- shapes/arrows:提供矩形、菱形、箭头等形状
- positioning:基于相对位置的排版(
below of=
等) - fit/backgrounds:群组和背景层,适合高阶布局
- calc:坐标运算,便于绘制拐角箭头
编译命令(以 PDFLaTeX 为例):
pdflatex d3qn_training_process.tex
二、基础语法:节点、箭头、定位与样式
2.1 定义可复用样式
样式统一管理使图形风格一致、修改方便:
\tikzstyle{process} = [rectangle, draw, fill=blue!20,text width=3.5cm, text centered, rounded corners, minimum height=1.2cm]
\tikzstyle{network} = [rectangle, draw, fill=green!20,text width=4cm, text centered, rounded corners, minimum height=1.2cm]
\tikzstyle{buffer} = [rectangle, draw=none, fill=none,text width=3cm, text centered, minimum height=2cm, minimum width=4cm]
\tikzstyle{decision} = [diamond, draw, fill=yellow!20,text width=2cm, text centered, minimum height=1cm, aspect=2.5]
\tikzstyle{arrow} = [thick,->,>=stealth]
\tikzstyle{copyarrow} = [thick,->,>=stealth,dashed,red]
process/network
:流程框与网络框,颜色区分语义decision
:菱形判定框,aspect
控制菱形比例arrow/copyarrow
:主流程箭头与“拷贝参数”虚线红箭头
2.2 放置节点(基于定位库)
\begin{tikzpicture}[node distance=2cm, auto]
% 经验回放“圆柱”容器:先占位,再用普通绘图命令画造型
\node [buffer] (buffer) {};% 基于相对定位
\node [process, below of=buffer, yshift=-0.5cm] (sampling) {Batch\\Sampling};
\node [network, below left of=sampling, xshift=-2cm] (current) {Current Network\\$\\bm{\\Theta} = \{\\bm{W}_V, \\bm{b}_V, \\bm{W}_A, \\bm{b}_A\}$};
\node [network, below right of=sampling, xshift=2cm] (target) {Target Network\\$\hat{\\bm{\\Theta}} = \{\hat{\\bm{W}}_V, \hat{\\bm{b}}_V, \hat{\\bm{W}}_A, \hat{\\bm{b}}_A\}$};
below of
、below left of
、below right of
:不必手算坐标xshift/yshift
:微调位置,解决重叠或对齐问题
2.3 画箭头与拐角
\draw [arrow] (buffer) -- (sampling); % 直连
\draw [arrow] (sampling) -| (current); % 右角拐弯
\draw [arrow] (current) |- (tderror); % 左角拐弯
-|
与 |-
提供直角转折,配合 calc
库可自定义拐点路径。
三、案例复现:D3QN训练流程图(逐步搭建)
目标流程:Experience Buffer → Batch Sampling → Current / Target Networks → TD Error → Gradient Update → Update Current Network → Update Buffer Priorities → 判定拷贝 → Copy → 参数回注与循环。
3.1 绘制“经验回放”圆柱
圆柱更贴近“缓冲区/数据库”语义:
\node [buffer] (buffer) {};
\begin{scope}[shift={(buffer.center)}]\draw[fill=cyan!20, draw=cyan!60, thick] (-1.5,-1) rectangle (1.5,1);\draw[fill=cyan!20, draw=cyan!60, thick] (0,1) ellipse (1.5cm and 0.3cm);\draw[fill=cyan!20, draw=cyan!60, thick] (0,-1) ellipse (1.5cm and 0.3cm);\node[text width=3cm, text centered] at (0,0) {Experience\\Buffer};
\end{scope}
scope+shift
:局部坐标偏移,便于以节点中心为参照绘制复杂形状- 上下两个椭圆 + 中间矩形 = 经典圆柱体视觉
3.2 主干流程节点
\node [process, below of=buffer, yshift=-0.5cm] (sampling) {Batch\\Sampling};
\node [process, below of=sampling, yshift=-1.5cm] (tderror) {TD Error\\Calculation\\$\\delta = |y - Q(s,a)|$};
\node [process, below of=tderror] (gradient) {Gradient\\Update\\$\\nabla_\\theta \\bm{\\mathcal{L}}$};
\node [process, below of=gradient] (update_current) {Update Current\\Network Parameters};
\node [process, below of=update_current] (update_buffer) {Update Buffer\\Priorities\\$p_i = |\\delta_i|^\\alpha$};
\node [decision, below of=update_buffer, yshift=-0.5cm] (decision) {Every C\\Steps?};
\node [process, below of=decision, yshift=-0.5cm] (copy) {Copy Parameters\\$\hat{\\bm{\\Theta}} \leftarrow \\bm{\\Theta}$};
公式采用 amsmath
/bm
宏包增强排版(粗体、帽子、向量等)。
3.3 分支:当前/目标网络
左右分支体现“估计”和“目标”网络:
\node [network, below left of=sampling, xshift=-2cm] (current) {Current Network\\$\\bm{\\Theta} = \{\\bm{W}_V, \\bm{b}_V, \\bm{W}_A, \\bm{b}_A\}$};
\node [network, below right of=sampling, xshift=2cm] (target) {Target Network\\$\hat{\\bm{\\Theta}} = \{\hat{\\bm{W}}_V, \hat{\\bm{b}}_V, \hat{\\bm{W}}_A, \hat{\\bm{b}}_A\}$};
\draw [arrow] (sampling) -| (current);
\draw [arrow] (sampling) -| (target);
\draw [arrow] (current) |- (tderror) node[pos=0.7, above] {$Q(s,a)$};
\draw [arrow] (target) |- (tderror) node[pos=0.7, above] {$y$};
node[pos=.., above]{...}
在箭头上添加标签,标明信息来源。
3.4 主流程箭头与循环
\draw [arrow] (buffer) -- (sampling);
\draw [arrow] (tderror) -- (gradient);
\draw [arrow] (gradient) -- (update_current);
\draw [arrow] (update_current) -- (update_buffer);
\draw [arrow] (update_buffer) -- (decision);
\draw [arrow] (decision) -- node[right] {Yes} (copy);
拷贝参数的“回注”路径(虚线红色)
\draw [copyarrow] (copy.east) -| ++(4.5,0) |- (target.east) node[pos=0.2, above] {update};
copy.east
/target.east
:使用锚点控制连线端点- 先
-|
向右,再|-
向上折返,避开主干
【逐段解释】
- (copy.east):从节点
copy
的东侧锚点(右侧中点)出发。 - -|:右角折线路由,几何含义为“先横后竖”。形式上
A -| B
等价于A -- (x_B, y_A) -- B
。 - ++(4.5,0):相对坐标并“更新当前点”。从当前位置向右移动 4.5(单位缺省为 cm),新的位置被设为“当前点”。因此
- | ++(4.5,0)
的效果是:先沿水平方向移到距copy.east
右侧 4.5 的位置,作为折角转折点,拉开与主干的间距。 - |- (target.east):左角折线路由,几何含义为“先竖后横”。对于当前点
C
与目标点B
,C |- B
等价于C -- (x_C, y_B) -- B
,即先竖直到与B
同 y,再横到B
。 - node[pos=0.2, above]{update}:在“整条路径”的 20% 处放置标签,位置相对于路径切线方向的上方。可用
pos=...
(0~1)、near start
、midway
、near end
、sloped
等微调。如果想明确标注在最后一段上,更稳妥的写法是将标签紧跟在|- (target.east)
之后或把路径拆成两条。
【等价写法(更直观)】
% 用 calc 显式给出中间拐点:
\draw[copyarrow](copy.east) -- ($(copy.east)+(4.5,0)$)|- (target.east)node[pos=0.2, above]{update};
上述写法与原语句效果一致:第一段水平右移 4.5 形成“让路”的走线,再以 |-
竖直对齐后水平接入 target.east
。
决策失败与循环回到缓冲区
\draw [arrow] (decision.west) -| ++(-3.5,0) |- ($(buffer.west)+(0,-0.3)$);
\node [left of=decision, xshift=-1cm, yshift=0.25cm, font=\small] {No};
\draw [arrow] (copy.west) -| ++(-5.5,0) |- ($(buffer.west)+(0,0.3)$);
calc
库语法$(A)+(dx,dy)$
:相对位移更直观- 通过不同高度返回
buffer
,避免线路重叠
四、进阶技巧:布局、分组与背景层
4.1 使用 fit
为子系统加外框
\node[draw=gray!60, rounded corners, inner sep=6pt, fit=(current)(target)] (netgroup) {};
\node[above=2pt of netgroup, font=\small, gray!70] {Networks};
fit
将多个节点打包为一个“群组”,便于标注模块边界。
4.2 背景层统一渲染
\begin{scope}[on background layer]\draw[fill=gray!5, draw=gray!20, rounded corners]($(buffer.north west)+(-0.8,0.8)$) rectangle ($(update_buffer.south east)+(0.8,-0.8)$);
\end{scope}
背景层避免覆盖前景节点/箭头,适合大区域底色与分区。
4.3 对齐与等距技巧
- 使用
node distance
控制默认间距 - 用
xshift/yshift
精调 - 复杂场景可借助隐式锚点(如不可见的对齐参考节点)
4.4 宏与样式参数化
将颜色、圆角、间距参数集中定义,便于不同主题复用:
\tikzset{flow/process/.style={rectangle, draw, rounded corners, fill=#1!18, text width=#2, minimum height=1.1cm, text centered},flow/process/.default={blue}{3.6cm}
}
调用:\node[flow/process=red]{...};
或 \node[flow/process]{...};
五、常见问题与排错建议
- 箭头穿帮/重叠:
- 调整
-|
/|-
转折路径 - 使用
calc
的坐标计算插入中间拐点
- 调整
- 节点文本溢出:
- 增大
text width
或缩小字体font=\small
- 使用换行
\\
明确分行
- 增大
- 整体不居中/留白过大:
standalone
的border
控制边距- 外围再加一层
fit
背景框裁定视野
- 颜色太艳:
- 用
color!x
的浅色系(如blue!15
、green!20
)
- 用
- 可维护性差:
- 统一样式、集中宏定义;模块化分组;注释到位
六、完整代码与导出
将上述片段整合即可得到完整、可编译的 d3qn_training_process.tex
(您已提供)。若需导出 PNG:
pdflatex d3qn_training_process.tex
magick -density 300 d3qn_training_process.pdf -quality 95 d3qn_training_process.png
或使用 ghostscript
/pdftoppm
实现高分辨率转换。
七、小结与扩展
本文基于 D3QN 训练流程,系统演示了 TikZ 绘制流程图的全流程:从样式定义、相对定位、箭头拐角、到进阶的 fit/background/calc
。当图逐渐复杂时,建议:
- 把“数据流”和“控制流”用不同颜色/线型区分
- 将模块封装成可复用样式或宏
- 使用
scope
管理局部坐标与样式,减少重复
在此基础上,你可以快速构建训练流水线、软件架构、通信协议、任务调度等多类流程图,并保持学术级排版质量。