The article body for this language is not available yet; showing the other language.
Blog & updates详细介绍如何使用 TikZ 在 LaTeX 文档中绘制图论图,涵盖有向图、无向图、加权图的代码示例,并介绍如何用 DrawFig 一键生成 TikZ 代码。
\usepackage{tikz}
\usetikzlibrary{graphs, graphdrawing, arrows.meta, positioning}
\usegdlibrary{layered, force}
说明:
- tikz 是核心包
- graphs 和 graphdrawing 提供图绘制专用语法
- arrows.meta 提供更美观的箭头样式
- positioning 支持相对位置布局
- layered 和 force 是两种自动布局引擎(需要 LuaLaTeX 编译)
注意: graphdrawing 库需要使用 LuaLaTeX 编译,如果你使用 pdfLaTeX,需要手动指定节点坐标。Overleaf 默认支持 LuaLaTeX,切换方法:菜单 → 编译器 → LuaLaTeX。
\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 之间画一条线段
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=S 是 positioning 库提供的相对定位语法
\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) |
\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。
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 控制层间距。