今天我们来介绍使用基于Tikz
的pgfplots
宏包绘制堆叠图、折线图和误差线的组合图形。
作图分析
本图的难点在于:
- 堆叠柱形图属于
ybar stacked
类型的图,而折线图和误差线作图是另一种类型的图,当坐标系设置中有ybar stacked,
键值时,pgfplots
会将折线图的数据化成矩形堆叠上去,而不是画成线型图。 - 解决方案是分别在两个坐标系中作图,
pgfplots
会将后面的图叠加到先作的图上,这就是“图层”的机制。两个坐标系的设置也是一个难点,它们的设置要相同,这样才不会出现坐标系不重合的情形。 - 堆叠图的画法在前一篇推文中,已经做了详细介绍,下面只讲误差线的画法。
折线图+误差线的画法
首先解释一些关于误差的概念:
我们通过实验得到的观察值和真值之间往往有有一个差值,我们常常给出一个误差范围来描述观察值的精确程度。观测值与真值之差的绝对值的上界叫做绝对误差,记作.
绝对误差占真值的绝对值的比率的上界则称为相对误差:
如何在图形上呈现观测点的误差呢?以坐标为例,只需要在观测点处画一条从点到点的线段即可。
本图中数据表Total
中给出了三列值,第一二列是的取值,而第三列就是值的绝对误差。
画误差线的代码只有下面一行:
\addplot+[red!90!black,mark=none]plot [
error bars/.cd,
y dir=both, y explicit,
] table [y error=error] {yEr.dat};
\end{axis}
-
[red!90!black,mark=none]
中选项说明折线的颜色和标记; -
[error bars/.cd,y dir=both, y explicit,]
中第一个键是对数值的设置,y dir=both
的含义是显示完整的误差线,另外两种选择:y dir=plus
和y dir=minus
分别只显示误差线的上半部分和下半部分。y explicit,
是为每个观测值指定误差范围,相反地,y fixed=0.1
是为所有的观测值指定一个统一的、不变的误差值。
\begin{tikzpicture}
\begin{axis}[
legend style={at={(0.5,-0.20)},
anchor=north,legend columns=-1},
ylabel={C(\textup{$\mu$g}\ \textup{g}$^{-1}$)},
symbolic x coords={bDec,Dec, Jan, Feb, Mar,
Apr, May, Jun, Jul, Aug, Sep, Oct, Nov,aNov},
xtick=data,
x tick label style={rotate=45,anchor=east},
xlabel={Month},
ymin=0,ymax=3500,
xmin=bDec,xmax=aNov
]
\addplot+[red!90!black,mark=none]plot [
error bars/.cd,
y dir=both, y explicit,
] table [y error=error] {yEr.dat};
\end{axis}
\end{tikzpicture}
合成一张图
将堆叠图和折线+误差线图放在同一个tikzpicture
环境中,就能将它们合成为一幅图了,注意要将堆叠图放在前面,折线图+误差线图放在后面,否则会出现折线图被遮挡的意外效果哟!
得到的成图如下:
学习Tikz作图虽然有一定难度,但是从效果来说还是值得我们花时间去学习的!