PGF/TikZ and Pgfplots
Table of Contents
1. PGF/TikZ 简介
PGF/TikZ 是 Latex 中强大的画图工具(TikZ 基于 pgf)。
pgf stands for Portable Graphics Format. TikZ is a recursive acronym for "TikZ ist kein Zeichenprogramm" (German for "TikZ is not a drawing program").
参考:
A very minimal introduction to TikZ: http://cremeronline.com/LaTeX/minimaltikz.pdf
The TikZ and PGF Packages (Manual): http://mirror.bjtu.edu.cn/CTAN/graphics/pgf/base/doc/pgfmanual.pdf
http://ctan.org/pkg/pgf
http://martin-thoma.com/tag/tikz/
http://www.texample.net/tikz/examples/
https://www.sharelatex.com/learn/Pgfplots_package
1.1. 环境设置
设置 \usepackage{tikz} 后,在 \begin{tikzpicture} 和 \end{tikzpicture} 之间即可编写 PGF/TikZ 代码了。
\documentclass{article}
\usepackage{tikz}
%% \usepackage{pgfplots} % 使用\begin{axis}需要它
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
somethings...
\end{tikzpicture}
\end{document}
上面只是一个最基本的环境设置,对于一些库可能还需要使用 \usetikzlibrary{...} 指令。一些常用的库可参考:http://tex.stackexchange.com/questions/42611/list-of-available-tikz-libraries-with-a-short-introduction
2. 绘制基本图形
下面将演示用 PGF/TikZ 画一些基本图形的方法。
2.1. 直线
2.2. 虚线([dashed] or [dotted])
\begin{tikzpicture}
\draw [dashed] (0,1) -- (5,1);
\draw [dotted] (0,0.5) -- (5,0.5);
\end{tikzpicture}
效果如图 2 所示。
Figure 2: TikZ 虚线实例
2.3. 控制线的粗细
可以用 [ultra thick], [very thick], [thick], [thin], [very thin], [ultra thin] 来控制线的粗细,也可以直接用 line width 来控制粗细(默认单位为 pt)。
\begin{tikzpicture}
\draw [ultra thick] (0,2) -- (5,2);
\draw [very thick] (0,1.5) -- (5,1.5);
\draw [thick] (0,1) -- (5,1);
\draw [thin] (0,0.5) -- (5, 0.5);
\draw [dashed, line width=12] (0,0) -- (5, 0);
\end{tikzpicture}
效果如图 3 所示。
Figure 3: TikZ 控制线的粗细实例
2.4. 箭头
\begin{tikzpicture}
\draw [->] (0,2) -- (5,2);
\draw [<-] (0,1.5) -- (5,1.5);
\draw [<->] (0,1) -- (5,1);
\draw [dashed, |->] (0,0.5) -- (5, 0.5);
\draw [<-|] (0,0) -- (3, 0) -- (4, -0.5) -- (5,0);
\end{tikzpicture}
效果如图 4 所示。
Figure 4: TikZ 控制线的粗细实例
2.5. 矩形、圆等等
\begin{tikzpicture}
\draw [thick] (0,0) rectangle (1.5,1);
\draw (2,0) -- (3.5,0) -- (3.5,1) -- (2,0);
\draw (4.5,0.5) circle [radius=0.5];
\draw (6.5,0.5) circle [x radius=1, y radius=0.5];
\end{tikzpicture}
效果如图 5 所示。
Figure 5: TikZ 矩形、圆等实例
说明:不用 rectangle ,直接画 4 条线显然也可以画矩形。
2.6. 给某点作标记
如何标记某个点呢?请看下面例子。
\begin{tikzpicture}
\draw [thick, <->] (0,2) -- (0,0) -- (6,0);
\node at (1,1) {$(1,1)$};
\draw [fill] (3,1) circle [radius=1.5pt];
\node [below] at (3,1) {below};
\node [above] at (3,1) {above};
\node [left] at (3,1) {left};
\node [right] at (3,1) {right};
\draw [fill] (5,1) circle [radius=1.5pt];
\node [above right] at (5,1) {$(5,1)$};
\end{tikzpicture}
效果如图 6 所示。
Figure 6: TikZ 给某点作标记
3. Pgfplots 包
The pgfplots package is a powerful tool, based on tikz.
3.1. 实例:画函数 sin(x)的图形
\documentclass{minimal}
\usepackage{pgfplots}
\thispagestyle{empty}
\begin{document}
%%% 第一个图
\begin{tikzpicture}
\begin{axis}
\addplot [] {sin(deg(x))};
\end{axis}
\end{tikzpicture}
%%% 第二个图
\begin{tikzpicture}
\begin{axis} [
axis x line=center, % 和下行一起,显示交点在原点的直角坐标
axis y line=center,
xlabel = $x$,
ylabel = {$f(x)$},
xlabel style={right},
ylabel style={above},
xmin = -8, % 和下行一起,表示x轴显示范围为 [-8,8]
xmax = 8,
]
\addplot [
samples=201, % 用更多的样本点(如201个)画图,使图形更平滑。
domain=-6:6, % 在[-6,6]这个区间内画图。
] {sin(deg(x))};
\addlegendentry{$sin(x)$} % 增加图例。
\end{axis}
\end{tikzpicture}
\end{document}
效果如图 7 所示。
Figure 7: pgfplots 画 f(x)=sin(x)图形
3.2. 实例:画多个函数和点
\documentclass{minimal}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis x line=center,
axis y line=center,
xlabel = $x$,
ylabel = {$f(x)$},
xlabel style={right},
ylabel style={above},
xmin = -10,
xmax = 10,
]
%% 画 y=x^2 - 1
\addplot [domain=-9:9] {x^2 - 1};
\addlegendentry{$x^2 - 1$}
%% 画 y=x
\addplot [
domain=-7:7,
dashed,
]
{5*x};
\addlegendentry{$5x$}
%% 画一个点
\addplot[
color=red,
mark=o,
]
coordinates {
(1,10)
};
%% 画三个点
\addplot[
color=blue,
only marks, % 仅显示离散的点,不要连接它们
mark=x,
]
coordinates {
(1,-10) (2, -20) (3,-10)
};
\end{axis}
\end{tikzpicture}
\end{document}
效果如图 8 所示。
Figure 8: pgfplots 画多个图形
3.3. 实例:展示多个数据文件
\documentclass{minimal}
\usepackage{pgfplots}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[
title=Convergence Plot,
xlabel={Degrees of freedom},
ylabel={$L_2$ Error},
grid=major,
legend entries={$d=2$,$d=3$,$d=4$},
]
\addplot table {tikz_pgfplots_datafiles_d1.dat};
\addplot table {tikz_pgfplots_datafiles_d2.dat};
\addplot table {tikz_pgfplots_datafiles_d3.dat};
\end{loglogaxis}
\end{tikzpicture}
\end{document}
三个数据文件分别为:
$ cat tikz_pgfplots_datafiles_d1.dat dof l2_err level 5 8.312e-02 2 17 2.547e-02 3 49 7.407e-03 4 129 2.102e-03 5 321 5.874e-04 6 769 1.623e-04 7 1793 4.442e-05 8 4097 1.207e-05 9 9217 3.261e-06 10 $ cat tikz_pgfplots_datafiles_d2.dat dof l2_err level 7 8.472e-02 2 31 3.044e-02 3 111 1.022e-02 4 351 3.303e-03 5 1023 1.039e-03 6 2815 3.196e-04 7 7423 9.658e-05 8 18943 2.873e-05 9 47103 8.437e-06 10 $ cat tikz_pgfplots_datafiles_d3.dat dof l2_err level 9 7.881e-02 2 49 3.243e-02 3 209 1.232e-02 4 769 4.454e-03 5 2561 1.551e-03 6 7937 5.236e-04 7 23297 1.723e-04 8 65537 5.545e-05 9 178177 1.751e-05 10
效果如图 9 所示。
Figure 9: pgfplots 展示多个数据文件
注:这个实例摘自 pgfplots manual
3.4. 实例:画离散的点
\documentclass{minimal}
\usepackage{pgfplots}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[
scatter,
only marks,
point meta=explicit symbolic,
scatter/classes={
a={mark=square*,blue},
b={mark=triangle*,red},
c={mark=o,draw=black}},
]
table[meta=label] {
x y label
0.1 0.15 a
0.45 0.27 c
0.02 0.17 a
0.06 0.1 a
0.9 0.5 b
0.5 0.3 c
0.85 0.52 b
0.12 0.05 a
0.73 0.45 b
0.53 0.25 c
0.76 0.5 b
0.55 0.32 c
};
\end{axis}
\end{tikzpicture}
\end{document}
效果如图 10 所示。
Figure 10: pgfplots 画离散的点
注:这个实例摘自 pgfplots manual
4. 绘制函数图形
用 plot 可以画函数图形,如:
\begin{tikzpicture}
\draw [<->] (0,6) -- (0,0) -- (5,0);
\draw[thick, domain=0:4] plot (\x, {\x + 1)});
\end{tikzpicture}
效果如图 11 所示。
Figure 11: TikZ 画 f(x)=x+1 图形
再看一个画函数图形的例子。
\begin{tikzpicture}[domain=0:4]
\draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,3.9);
\draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$};
\draw[->] (0,-1.2) -- (0,4.2) node[above] {$f(x)$};
\draw[color=red] plot (\x,\x) node[right] {$f(x) =x$};
% \x r means to convert '\x' from degrees to _r_adians:
\draw[color=blue] plot (\x,{sin(\x r)}) node[right] {$f(x) = \sin x$};
\draw[color=orange] plot (\x,{0.05*exp(\x)}) node[right] {$f(x) = \frac{1}{20} \mathrm e^x$};
\end{tikzpicture}
效果如图 12 所示。
Figure 12: TikZ 画函数图形实例
4.1. 实例:使用“Data Visualization 库”画函数图
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{datavisualization}
\usetikzlibrary{datavisualization.formats.functions}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\datavisualization[school book axes,
visualize as smooth line]
data [format=function] {
var x : interval [-2:2];
func y = \value x * \value x + 1;
};
\end{tikzpicture}
\end{document}
效果如图 13 所示。
Figure 13: TikZ 使用 Data Visualization 画函数图形实例
4.2. 实例:使用“pgfplots 包”绘制数学函数图
\documentclass{minimal}
\usepackage{pgfplots}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[color=red]{exp(x)};
\end{axis}
\end{tikzpicture}
%Here ends the furst plot
\hskip 5pt
%Here begins the 3d plot
\begin{tikzpicture}
\begin{axis}
\addplot3[
surf,
]
{exp(-x^2-y^2)*x};
\end{axis}
\end{tikzpicture}
\end{document}
效果如图 14 所示。
Figure 14: TikZ 绘制数学函数图
5. 其它例子
关于 PGF/TikZ 的更加例子请参考:http://www.texample.net/tikz/examples/
5.1. 实例:绘制神经网络
参考:http://www.texample.net/tikz/examples/neural-network/
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pagestyle{empty}
\def\layersep{2.5cm}
\begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep]
\tikzstyle{every pin edge}=[<-,shorten <=1pt]
\tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt]
\tikzstyle{input neuron}=[neuron, fill=green!50];
\tikzstyle{output neuron}=[neuron, fill=red!50];
\tikzstyle{hidden neuron}=[neuron, fill=blue!50];
\tikzstyle{annot} = [text width=4em, text centered]
% Draw the input layer nodes
\foreach \name / \y in {1,...,4}
% This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
\node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,5}
\path[yshift=0.5cm]
node[hidden neuron] (H-\name) at (\layersep,-\y cm) {};
% Draw the output layer node
\node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {};
% Connect every node in the input layer with every node in the
% hidden layer.
\foreach \source in {1,...,4}
\foreach \dest in {1,...,5}
\path (I-\source) edge (H-\dest);
% Connect every node in the hidden layer with the output layer
\foreach \source in {1,...,5}
\path (H-\source) edge (O);
% Annotate the layers
\node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer};
\node[annot,left of=hl] {Input layer};
\node[annot,right of=hl] {Output layer};
\end{tikzpicture}
% End of code
\end{document}
效果如图 15 所示。
Figure 15: TikZ 画神经网络
5.2. 实例:绘制自动机
参考:http://martin-thoma.com/how-to-draw-a-finite-state-machine/
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=2cm]
\node[initial,state,accepting] (S) {$S$};
\node[state] (q1) [right of=S] {$q_1$};
\node[state] (q2) [right of=q1] {$q_2$};
\path[->] (S) edge [loop above] node {a} (S)
edge node {a} (q1)
(q1) edge [bend left] node {a} (S)
edge node {b} (q2)
(q2) edge [loop above] node {b} (q2)
edge [bend left] node {b} (q1);
\end{tikzpicture}
\end{document}
效果如图 16 所示。
Figure 16: TikZ 画自动机