TikZ、PGFPlots 与专业绘图
TikZ 用于示意图、流程图和几何图;PGFPlots 建立在 TikZ 之上,适合坐标轴和数据图。两者生成的是可缩放的矢量图,适合需要与 LaTeX 字体、公式和版式保持一致的场景。
EasyLaTeX 编译器设置:XeLaTeX + ctex;TikZ 需要 tikz,数据图需要 pgfplots。较复杂的图会明显增加编译时间。
何时选择代码绘图
| 需求 | 推荐方式 |
|---|---|
| 真实照片、扫描件、软件截图 | 插入现成图片 |
| 流程图、结构图、几何示意图 | TikZ |
| 函数曲线、实验数据、误差棒 | PGFPlots |
| 复杂科研插图或已有专业图形文件 | 使用专业软件导出 PDF 后插入;SVG 先转换为 PDF 或适合的位图 |
代码绘图的优势是可复现、可版本控制和字体一致;它不是所有图形的替代品。复杂插图应选择最适合的数据处理与绘图工具,再以稳定格式纳入文档。
TikZ 的最小示意图
在导言区加载 TikZ:
\usepackage{tikz}
下面绘制坐标轴和一条线段:
\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 添加标注。
节点与箭头
流程图常用节点和箭头。先定义样式,再复用:
\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 库:
\usetikzlibrary{positioning}
样式集中定义可以让流程图保持一致。节点文字过长时,应缩短标签或指定 text width,不要任由节点互相重叠。
PGFPlots 的最小数据图
加载 PGFPlots 并固定兼容版本:
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
下面使用内嵌坐标绘制一条曲线:
\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:
time,velocity
0,0
1,1
2,4
3,9
然后使用:
\addplot table [x=time, y=velocity, col sep=comma] {data/velocity.csv};
将数据与绘图代码分开,便于检查、更新和复现实验结果。CSV 文件中的列名必须与 x=、y= 指定的名称一致。
图形放入文档
TikZ 与 PGFPlots 生成的内容也应放进 figure 环境,从而获得图题、标签和交叉引用:
\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 上传到正文项目中作为图片插入。
完整示例
\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}