PGFplots has to estimate the space taken up by the labels, which is not easy and can lead to the plot having a different size than the one specified using width
. In this case, I would use the option scale only axis
, which applies the width
and height
options only to the axis, not the whole plot including the labels.
While this means you have to manually choose a width
that's a bit smaller than your overall intended plot width, it makes the alignment of the plots a lot easier, since you now know that both large plot axes have the same width.
To align the different plots, you should keep them in the same tikzpicture
, name the plots using name
, and position them using at=(<other plot name>.below south east), anchor=(north east)
or something similar. The anchors south
, south east
, etc. refer to points on the axes, the anchors below south east
, right of south east
, etc. refer to projections of points on the axes onto the bounding box of the plot.
\documentclass{article}
\usepackage{pgfplots}
\pgfkeys{/pgfplots/MyAxisStyle/.style={xmin=0,xmax=5, ymin=0,ymax=3,height=4cm,width=0.9\linewidth,scale only axis}}
\pgfkeys{/pgfplots/MyLineStyle/.style={samples=50, smooth, ultra thick}}
\begin{document}
\begin{minipage}{0.9\linewidth}\centering
\hrule% To see actual \linewidth
\medskip
\begin{tikzpicture}
\begin{axis}[MyAxisStyle, xmax=10, ymax=110,scale only axis,name=first]
\addplot[MyLineStyle, domain=0:10, ,red] {(x^2)} node [left] {$y=x^2$};
\end{axis}
\begin{axis}[MyAxisStyle, xmax=2,ymax=9,
at=(first.below south west),
anchor=north west,
yshift=-0.25cm,
name=second]
\addplot[MyLineStyle, domain=0:2 ,green] {(x)^3} node [left] {$y=x^3$};
\end{axis}
\begin{axis}[MyAxisStyle,
width=0.4\linewidth,
at=(second.below south west),
anchor=north west,
yshift=-0.25cm,
name=third]
\addplot[MyLineStyle, domain=0:5, blue] {sqrt(x)} node [above left] {$y=\sqrt{x}$};
\end{axis}
\begin{axis}[MyAxisStyle, height=3cm,width=0.4\linewidth,
at=(second.east|-third.outer south east),
anchor=outer south east
]
\addplot[MyLineStyle, domain=0:5, blue] {sqrt(x)} node [above left] {$y=\sqrt{x}$};
\end{axis}
\end{tikzpicture}
\hrule% To see actual \linewidth
\end{minipage}
\end{document}
This happens because PGFPlots only uses one "stack" per axis: You're stacking the second confidence interval on top of the first. The easiest way to fix this is probably to use the approach described in "Is there an easy way of using line thickness as error indicator in a plot?": After plotting the first confidence interval, stack the upper bound on top again, using stack dir=minus
. That way, the stack will be reset to zero, and you can draw the second confidence interval in the same fashion as the first:
\documentclass{standalone}
\usepackage{pgfplots, tikz}
\usepackage{pgfplotstable}
\pgfplotstableread{
temps y_h y_h__inf y_h__sup y_f y_f__inf y_f__sup
1 0.237340 0.135170 0.339511 0.237653 0.135482 0.339823
2 0.561320 0.422007 0.700633 0.165871 0.026558 0.305184
3 0.694760 0.534205 0.855314 0.074856 -0.085698 0.235411
4 0.728306 0.560179 0.896432 0.003361 -0.164765 0.171487
5 0.711710 0.544944 0.878477 -0.044582 -0.211349 0.122184
6 0.671241 0.511191 0.831291 -0.073347 -0.233397 0.086703
7 0.621177 0.471219 0.771135 -0.088418 -0.238376 0.061540
8 0.569354 0.431826 0.706882 -0.094382 -0.231910 0.043146
9 0.519973 0.396571 0.643376 -0.094619 -0.218022 0.028783
10 0.475121 0.366990 0.583251 -0.091467 -0.199598 0.016664
}{\table}
\begin{document}
\begin{tikzpicture}
\begin{axis}
% y_h confidence interval
\addplot [stack plots=y, fill=none, draw=none, forget plot] table [x=temps, y=y_h__inf] {\table} \closedcycle;
\addplot [stack plots=y, fill=gray!50, opacity=0.4, draw opacity=0, area legend] table [x=temps, y expr=\thisrow{y_h__sup}-\thisrow{y_h__inf}] {\table} \closedcycle;
% subtract the upper bound so our stack is back at zero
\addplot [stack plots=y, stack dir=minus, forget plot, draw=none] table [x=temps, y=y_h__sup] {\table};
% y_f confidence interval
\addplot [stack plots=y, fill=none, draw=none, forget plot] table [x=temps, y=y_f__inf] {\table} \closedcycle;
\addplot [stack plots=y, fill=gray!50, opacity=0.4, draw opacity=0, area legend] table [x=temps, y expr=\thisrow{y_f__sup}-\thisrow{y_f__inf}] {\table} \closedcycle;
% the line plots (y_h and y_f)
\addplot [stack plots=false, very thick,smooth,blue] table [x=temps, y=y_h] {\table};
\addplot [stack plots=false, very thick,smooth,blue] table [x=temps, y=y_f] {\table};
\end{axis}
\end{tikzpicture}
\end{document}
Best Answer
A part of the total solution is to use the
external
library as suggested and then put the optiondraft
to\documentclass[draft]{whatever}
. But doing so the image is replaced by a box of fixed dimensions, not equal to those of the real image.This happens because the external image created is not imported with
\includegraphics
, to correct this it is sufficient to add this line (\pgfkeys{/pgf/images/include external/.code=\includegraphics{#1}}
) before\tikzexternalize
. In this way we obtain the desired result: