← Back to blog

The article body for this language is not available yet; showing the other language.

Blog & updates

用 TikZ 画图论图:从零开始的完整教程

2026-04-19

详细介绍如何使用 TikZ 在 LaTeX 文档中绘制图论图,涵盖有向图、无向图、加权图的代码示例,并介绍如何用 DrawFig 一键生成 TikZ 代码。

用 TikZ 画图论图:从零开始的完整教程

引言

在撰写算法论文或图论相关学术文章时,高质量的图形插图是不可或缺的。TikZ 作为 LaTeX 生态中最强大的绘图扩展包,可以生成矢量级别的精美图形,直接嵌入论文无需担心分辨率问题。 然而,TikZ 的学习曲线并不平缓——光是基础语法就足以让初学者望而却步。本文将以图论图为核心场景,带你从零掌握 TikZ 的图绘制技巧,同时介绍如何借助 DrawFig 大幅降低手写代码的成本。

一、准备工作:引入 TikZ 包

在 LaTeX 文档的 preamble 中添加以下内容:
\usepackage{tikz}
\usetikzlibrary{graphs, graphdrawing, arrows.meta, positioning}
\usegdlibrary{layered, force}
说明: - tikz 是核心包 - graphsgraphdrawing 提供图绘制专用语法 - arrows.meta 提供更美观的箭头样式 - positioning 支持相对位置布局 - layeredforce 是两种自动布局引擎(需要 LuaLaTeX 编译)
注意: graphdrawing 库需要使用 LuaLaTeX 编译,如果你使用 pdfLaTeX,需要手动指定节点坐标。Overleaf 默认支持 LuaLaTeX,切换方法:菜单 → 编译器 → LuaLaTeX。

二、绘制无向图

2.1 基础无向图

最简单的图:手动指定每个节点的坐标和边。
\begin{tikzpicture}
  % 定义节点
  \node[circle, draw, minimum size=1cm] (A) at (0,0) {$v_1$};
  \node[circle, draw, minimum size=1cm] (B) at (2,1) {$v_2$};
  \node[circle, draw, minimum size=1cm] (C) at (4,0) {$v_3$};
  \node[circle, draw, minimum size=1cm] (D) at (2,-1) {$v_4$};

  % 绘制边
  \draw (A) -- (B);
  \draw (A) -- (D);
  \draw (B) -- (C);
  \draw (C) -- (D);
  \draw (B) -- (D);
\end{tikzpicture}
效果说明: - \node[circle, draw] 创建一个带边框的圆形节点 - at (x,y) 指定节点的绝对坐标(单位:厘米) - \draw (A) -- (B) 在节点 A 和 B 之间画一条线段

2.2 使用 graphs 语法(更简洁)

\begin{tikzpicture}
  \graph[spring layout, node distance=2cm] {
    v1 -- v2 -- v3 -- v4 -- v1;
    v1 -- v3;
  };
\end{tikzpicture}
spring layout 会自动计算节点位置,适合快速生成布局自然的图(需 LuaLaTeX)。

三、绘制有向图

有向图只需将 \draw 改为带箭头的样式:
\begin{tikzpicture}[
  ->,                          % 全局设置箭头方向
  >=Stealth,                   % 使用 Stealth 箭头样式(更美观)
  node distance=2.5cm,
  every node/.style={circle, draw, minimum size=1cm}
]
  \node (S) {$s$};
  \node (A) [right of=S]        {$a$};
  \node (B) [above right of=A]  {$b$};
  \node (C) [below right of=A]  {$c$};
  \node (T) [right of=B]        {$t$};

  \draw (S) -> (A);
  \draw (A) -> (B);
  \draw (A) -> (C);
  \draw (B) -> (T);
  \draw (C) -> (T);
\end{tikzpicture}
关键参数解析: - -> 设置全局箭头方向(从源节点到目标节点) - >=Stealth 指定箭头形状,Stealth 是实心三角箭头,比默认箭头更清晰 - right of=Spositioning 库提供的相对定位语法

四、绘制加权图

在边上添加权重标签,是最常见的图论图需求之一:
\begin{tikzpicture}[
  every node/.style={circle, draw, minimum size=0.9cm},
  node distance=3cm
]
  \node (A) {A};
  \node (B) [right of=A] {B};
  \node (C) [below of=A] {C};
  \node (D) [right of=C] {D};

  % 带权重的边:用 node[midway, above] 在中点添加标签
  \draw (A) -- node[midway, above, draw=none, fill=white] {5} (B);
  \draw (A) -- node[midway, left,  draw=none, fill=white] {3} (C);
  \draw (B) -- node[midway, right, draw=none, fill=white] {7} (D);
  \draw (C) -- node[midway, below, draw=none, fill=white] {2} (D);
  \draw (B) -- node[midway, above right, draw=none, fill=white] {4} (C);
\end{tikzpicture}
技巧说明: - node[midway, above] 在边的中点上方添加一个节点(此处用于放权重文字) - draw=none, fill=white 让这个标签节点没有边框且背景白色,视觉上更干净 - midway 也可以替换为 near start(靠近起点)或 near end(靠近终点)

五、常见图论样式速查

需求 TikZ 写法
圆形节点 \node[circle, draw]
方形节点 \node[rectangle, draw]
红色节点 \node[circle, draw, fill=red!20]
虚线边 \draw[dashed] (A) -- (B)
弯曲边 \draw (A) to[bend left=30] (B)
自环 \draw (A) to[loop above] (A)
双向箭头 \draw[<->] (A) -- (B)
粗线边 \draw[line width=2pt] (A) -- (B)

六、用 DrawFig 自动生成 TikZ 代码

手写 TikZ 代码固然强大,但对于复杂图形,坐标计算和样式调整耗时极长。DrawFig 提供了一条更高效的路径: 工作流程:
  1. 在 DrawFig 编辑器中用 AI 生成或手动拖拽图形 打开 drawfig.com/editor.html,用自然语言描述你想要的图,AI 自动生成。
  2. 在画布上调整细节 拖拽节点调整位置,双击修改标签,右键设置颜色和线型。
  3. 一键导出 TikZ 代码 点击工具栏的「导出 TikZ」按钮,DrawFig 将当前图形转换为完整的 LaTeX TikZ 代码。
  4. 粘贴到论文 将生成的代码直接粘贴到 LaTeX 文档,编译即得高质量矢量图。
DrawFig 生成的代码示例:
\begin{tikzpicture}[
  ->, >=Stealth,
  node distance=2cm,
  every node/.style={circle, draw, minimum size=1cm, font=\small}
]
  \node (v1) at (0,0) {$v_1$};
  \node (v2) at (2,1) {$v_2$};
  \node (v3) at (4,0) {$v_3$};
  \node (v4) at (2,-1) {$v_4$};
  \draw[->] (v1) -- (v2);
  \draw[->] (v2) -- (v3);
  \draw[->] (v3) -- (v4);
  \draw[->] (v4) -- (v1);
  \draw[->, bend left=20] (v1) -- (v3);
\end{tikzpicture}
代码结构清晰,兼容 TeX Live、MiKTeX 和 Overleaf。

七、进阶:层次布局绘制 DAG

有向无环图(DAG)在算法论文中极为常见,layered 布局可以自动将节点分层排列:
\begin{tikzpicture}
  \graph[layered layout, grow=right, sibling distance=1.5cm, level distance=2.5cm]{
    "输入" -> {"预处理", "特征提取"};
    "预处理" -> "归一化";
    "特征提取" -> {"CNN特征", "手工特征"};
    {"归一化", "CNN特征", "手工特征"} -> "融合层";
    "融合层" -> "分类器" -> "输出";
  };
\end{tikzpicture}
grow=right 表示图从左向右生长,sibling distance 控制同层节点间距,level distance 控制层间距。

结语

TikZ 的强大毋庸置疑,但学习曲线确实陡峭。建议的学习路径是:先掌握基础节点和边的绘制,再学习样式定制,最后按需引入自动布局库。 如果你正在赶论文 deadline,直接使用 DrawFig 的可视化编辑 + TikZ 导出功能是最省时的方案——无需记忆任何语法,拖拽即得代码。 立即体验 DrawFig TikZ 一键导出 → drawfig.com/editor.html 支持中英文 AI 对话生成、Draw.io 格式编辑、一键导出 TikZ,全程免费,无需注册。
相关阅读:AI 对话生成图论图完整指南 | 图论绘图工具横向对比