跳转到正文
EasyLaTeXDocs

TikZ、PGFPlots 与专业绘图

TikZ 用于示意图、流程图和几何图;PGFPlots 建立在 TikZ 之上,适合坐标轴和数据图。两者生成的是可缩放的矢量图,适合需要与 LaTeX 字体、公式和版式保持一致的场景。

EasyLaTeX 编译器设置:XeLaTeX + ctex;TikZ 需要 tikz,数据图需要 pgfplots。较复杂的图会明显增加编译时间。

何时选择代码绘图

需求推荐方式
真实照片、扫描件、软件截图插入现成图片
流程图、结构图、几何示意图TikZ
函数曲线、实验数据、误差棒PGFPlots
复杂科研插图或已有专业图形文件使用专业软件导出 PDF 后插入;SVG 先转换为 PDF 或适合的位图

代码绘图的优势是可复现、可版本控制和字体一致;它不是所有图形的替代品。复杂插图应选择最适合的数据处理与绘图工具,再以稳定格式纳入文档。

TikZ 的最小示意图

在导言区加载 TikZ:

LaTeX
\usepackage{tikz}

下面绘制坐标轴和一条线段:

LaTeX
\begin{tikzpicture}
  \draw[->] (0,0) -- (4,0) node[right] {$x$};
  \draw[->] (0,0) -- (0,3) node[above] {$y$};
  \draw[blue,thick] (0,0) -- (3,2);
\end{tikzpicture}

坐标单位默认为厘米附近的 TikZ 画布单位;\draw 描述线条,方括号中提供样式,node 添加标注。

节点与箭头

流程图常用节点和箭头。先定义样式,再复用:

LaTeX
\begin{tikzpicture}[
  box/.style={draw, rounded corners, minimum width=2.5cm, minimum height=8mm},
  arrow/.style={->, thick}
]
  \node[box] (input) {输入数据};
  \node[box, right=1.5cm of input] (process) {处理};
  \node[box, right=1.5cm of process] (output) {输出结果};
  \draw[arrow] (input) -- (process);
  \draw[arrow] (process) -- (output);
\end{tikzpicture}

上述 right=... of ... 语法需要 TikZ 的 positioning 库:

LaTeX
\usetikzlibrary{positioning}

样式集中定义可以让流程图保持一致。节点文字过长时,应缩短标签或指定 text width,不要任由节点互相重叠。

PGFPlots 的最小数据图

加载 PGFPlots 并固定兼容版本:

LaTeX
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

下面使用内嵌坐标绘制一条曲线:

LaTeX
\begin{tikzpicture}
  \begin{axis}[
    xlabel={时间(s)},
    ylabel={速度(m/s)},
    grid=major
  ]
    \addplot coordinates {(0,0) (1,1) (2,4) (3,9)};
  \end{axis}
\end{tikzpicture}

axis 负责坐标轴、刻度、标签和网格,\addplot 负责一条数据序列。坐标轴名称和单位应写清楚,颜色与线型不能是区分多条曲线的唯一信息。

从表格数据读取

数据较多时,保存为 CSV 文件,例如 data/velocity.csv:

csv
time,velocity
0,0
1,1
2,4
3,9

然后使用:

LaTeX
\addplot table [x=time, y=velocity, col sep=comma] {data/velocity.csv};

将数据与绘图代码分开,便于检查、更新和复现实验结果。CSV 文件中的列名必须与 x=、y= 指定的名称一致。

图形放入文档

TikZ 与 PGFPlots 生成的内容也应放进 figure 环境,从而获得图题、标签和交叉引用:

LaTeX
\begin{figure}[tbp]
  \centering
  % tikzpicture 或 axis 放在这里
  \caption{速度随时间变化}
  \label{fig:velocity}
\end{figure}

这与插入外部图片的工作流相同。图题说明图展示了什么、数据来自哪里、误差如何表示;代码本身不替代图题。

常见问题

Environment tikzpicture undefined

确认导言区已经加载 \usepackage{tikz}。使用节点定位语法时还需 \usetikzlibrary{positioning}。

Environment axis undefined

确认加载的是 \usepackage{pgfplots},而不是仅加载 TikZ。axis 环境属于 PGFPlots。

图形编译很慢

减少不必要的采样点和图层,尽量从数据文件读取已经处理好的数据。大型绘图可另建绘图项目,在平台编译并下载 PDF,再把该 PDF 上传到正文项目中作为图片插入。

完整示例

LaTeX
\documentclass[UTF8,a4paper,12pt]{ctexart}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}

\begin{figure}[tbp]
  \centering
  \begin{tikzpicture}
    \begin{axis}[
      width=0.75\linewidth,
      xlabel={时间(s)},
      ylabel={速度(m/s)},
      grid=major
    ]
      \addplot[blue,thick,mark=*] coordinates {
        (0,0) (1,1) (2,4) (3,9)
      };
    \end{axis}
  \end{tikzpicture}
  \caption{速度随时间变化}
  \label{fig:velocity}
\end{figure}

\end{document}
TikZ、PGFPlots 与专业绘图 | EasyLaTeX | EasyLaTeX