Figures & TikZ

LaTeX 插图与 TikZ 绘图
完全指南

图表是学术论文中不可或缺的元素——实验结果的可视化、系统架构的示意图、算法的流程图都依赖于高质量的图表。本教程涵盖从插入外部图片到使用 TikZ 从零绘制矢量图的完整知识。

插入图片

LaTeX 通过 graphicx 宏包提供的 \includegraphics 命令插入外部图片。支持的格式取决于编译引擎:PDFLaTeX 支持 PDF、PNG、JPG;XeLaTeX 和 LuaLaTeX 在此基础上还支持 EPS。

include-graphics.tex
\usepackage{graphicx}

% 基本插入——直接指定文件名(不带扩展名更灵活)
\includegraphics{figures/architecture}

% 常用选项
\includegraphics[width=0.8\textwidth]{figures/result-plot}
\includegraphics[height=5cm]{figures/diagram}
\includegraphics[scale=0.5]{figures/photo}

% 组合选项:指定宽度并保持宽高比,同时旋转
\includegraphics[width=0.6\textwidth, angle=90]{figures/landscape-chart}

最常用的选项是 width height。推荐使用相对单位如 \textwidth \linewidth,这样图片会随版面宽度自动缩放。如果只指定宽度或高度中的一个,LaTeX 会自动保持原始宽高比。

图片位置控制

在正式论文中,图片应该放在 figure 浮动体环境中。LaTeX 会根据你给出的位置偏好参数自动选择最佳放置位置:

  • h — here,尽量放在代码出现的位置
  • t — top,放在页面顶部
  • b — bottom,放在页面底部
  • p — page,放在一个专门的浮动页上
  • H — 强制放在当前位置(需要 float 宏包)
figure-float.tex
\usepackage{graphicx}
\usepackage{float}  % 提供 [H] 选项

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.85\textwidth]{figures/training-loss}
  \caption{训练过程中损失函数的变化曲线。
    实线表示训练集损失,虚线表示验证集损失。}
  \label{fig:training-loss}
\end{figure}

% 在正文中引用
如图~\ref{fig:training-loss}~所示,模型在第 50 个 epoch
后开始收敛。
位置参数的顺序表示优先级。[htbp] 是最常用的组合,意思是:先尝试放在这里,不行就放顶部,再不行放底部,最后放浮动页。避免单独使用 [h],因为如果当前位置放不下,LaTeX 可能会把图片推到文档末尾。

子图排版

当你需要在一个浮动体中并排放置多张图片(例如对比实验结果),可以使用 subcaption 宏包提供的 subfigure 环境。每个子图有独立的标题和标签,可以单独引用。

subfigures.tex
\usepackage{graphicx}
\usepackage{subcaption}

\begin{figure}[htbp]
  \centering

  \begin{subfigure}[b]{0.48\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figures/result-baseline}
    \caption{Baseline 方法}
    \label{fig:baseline}
  \end{subfigure}
  \hfill
  \begin{subfigure}[b]{0.48\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figures/result-ours}
    \caption{本文方法}
    \label{fig:ours}
  \end{subfigure}

  \caption{两种方法在测试集上的分割结果对比。
    (a) Baseline 存在明显的边界模糊;
    (b) 本文方法的边界更加清晰。}
  \label{fig:comparison}
\end{figure}

% 引用方式
图~\ref{fig:comparison}~展示了对比结果,其中
图~\ref{fig:baseline}~为 Baseline,
图~\ref{fig:ours}~为本文方法。

关键技巧:两个子图的宽度之和应略小于 \textwidth(例如各 0.48),中间用 \hfill 填充间距。如果需要三张图并排,可以各设为 0.31 并加两个 \hfill。需要 2x2 排列时,在两行子图之间加一个空行或 \vspace

TikZ 基础

TikZ 是 LaTeX 中最强大的矢量绘图工具,全称为 “TikZ ist kein Zeichenprogramm”(TikZ 不是一个绘图程序)。它通过声明式的代码描述图形,编译后生成高质量的矢量图,与正文字体和样式完美融合。

tikz-basics.tex
\usepackage{tikz}

\begin{tikzpicture}
  % 绘制直线
  \draw (0,0) -- (3,0);

  % 绘制带箭头的线段
  \draw[->, thick] (0,-0.5) -- (3,-0.5);

  % 绘制矩形
  \draw[blue, thick] (0,-1.5) rectangle (2,-2.5);

  % 绘制填充矩形
  \fill[blue!20] (2.5,-1.5) rectangle (4.5,-2.5);
  \draw[blue, thick] (2.5,-1.5) rectangle (4.5,-2.5);

  % 绘制圆
  \draw[red, thick] (1,-4) circle (0.8);

  % 绘制填充圆
  \filldraw[fill=red!20, draw=red, thick] (3.5,-4) circle (0.8);

  % 添加文字标注
  \node at (1,-4) {A};
  \node at (3.5,-4) {B};
\end{tikzpicture}

TikZ 的核心概念:坐标用 (x,y) 表示(单位默认为厘米),\draw 绘制轮廓,\fill 填充区域,\filldraw 同时绘制轮廓并填充,\node 放置文字。颜色可以使用 blue!20 这样的混合语法表示 20% 的蓝色(即浅蓝色)。

流程图与架构图

TikZ 最常见的应用场景之一是绘制流程图。通过加载 shapes.geometric positioning 库,你可以用节点和边轻松构建流程图。

flowchart.tex
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows.meta, positioning}

\begin{tikzpicture}[
  node distance=1.5cm,
  % 定义节点样式
  startstop/.style={
    rectangle, rounded corners, minimum width=3cm,
    minimum height=1cm, text centered,
    draw=black, fill=red!30
  },
  process/.style={
    rectangle, minimum width=3cm, minimum height=1cm,
    text centered, draw=black, fill=blue!20
  },
  decision/.style={
    diamond, minimum width=3cm, minimum height=1cm,
    text centered, draw=black, fill=green!20,
    aspect=2
  },
  arrow/.style={
    thick, ->, >=Stealth
  }
]

  % 放置节点
  \node (start)    [startstop]                  {开始};
  \node (input)    [process, below of=start]    {输入数据};
  \node (process)  [process, below of=input]    {数据预处理};
  \node (decide)   [decision, below of=process] {准确率 > 90\%?};
  \node (output)   [process, below of=decide,
                     yshift=-0.5cm]              {输出模型};
  \node (stop)     [startstop, below of=output] {结束};
  \node (adjust)   [process, right of=decide,
                     xshift=3cm]                 {调整超参数};

  % 连接节点
  \draw [arrow] (start)   -- (input);
  \draw [arrow] (input)   -- (process);
  \draw [arrow] (process) -- (decide);
  \draw [arrow] (decide)  -- node[anchor=east] {是} (output);
  \draw [arrow] (decide)  -- node[anchor=south] {否} (adjust);
  \draw [arrow] (adjust)  |- (process);
  \draw [arrow] (output)  -- (stop);

\end{tikzpicture}

流程图的核心思路是先定义样式(.style),再放置节点(\node),最后用 \draw 连接。-- 表示直线连接,|- 表示先竖后横的折线,-| 表示先横后竖。positioning 库让你可以用 below ofright of 等相对定位而非手动计算坐标。

神经网络架构图示例

TikZ 还非常适合绘制论文中常见的神经网络架构示意图。下面是一个简化的多层感知机(MLP):

neural-network.tex
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{tikzpicture}[
  neuron/.style={circle, draw, minimum size=0.8cm,
    inner sep=0pt, fill=blue!10},
  input/.style={neuron, fill=green!15},
  output/.style={neuron, fill=red!15},
  layer label/.style={font=\small, text=gray},
]
  % Input layer
  \foreach \i in {1,...,3}
    \node[input] (I-\i) at (0, -\i*1.2) {$x_{\i}$};

  % Hidden layer
  \foreach \j in {1,...,4}
    \node[neuron] (H-\j) at (2.5, -\j*1.2+0.6) {$h_{\j}$};

  % Output layer
  \foreach \k in {1,...,2}
    \node[output] (O-\k) at (5, -\k*1.2-0.6) {$y_{\k}$};

  % Connections: input -> hidden
  \foreach \i in {1,...,3}
    \foreach \j in {1,...,4}
      \draw[->, gray!60] (I-\i) -- (H-\j);

  % Connections: hidden -> output
  \foreach \j in {1,...,4}
    \foreach \k in {1,...,2}
      \draw[->, gray!60] (H-\j) -- (O-\k);

  % Layer labels
  \node[layer label, above=0.3cm of I-1] {Input};
  \node[layer label, above=0.3cm of H-1] {Hidden};
  \node[layer label, above=0.3cm of O-1] {Output};
\end{tikzpicture}

CoCraft 的 AI 图表生成

TikZ 功能强大但学习曲线较陡。手动编写复杂图表的代码需要反复调整坐标和样式,耗时不少。CoCraft 的 AI 图表生成功能让你可以用自然语言描述想要的图表——例如 “画一个包含编码器和解码器的 Transformer 架构图”——AI 会自动生成对应的 TikZ 代码,并在编辑器中实时预览。你还可以上传手绘草图或参考图片,AI 会将其转化为精确的矢量图代码。

生成的代码完全可编辑,你可以在此基础上微调颜色、间距和标注,既省去了从零开始的繁琐,又保留了对每个细节的完全控制。

用 AI 生成 TikZ 图表

在 CoCraft 中用自然语言描述你想要的图表,AI 自动生成 TikZ 代码。

edit_document免费开始使用