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}
You could achieve this by patching the internal macro that is responsible for typesetting the labels to only typeset the label if it fits completely inside the bounding box:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepackage{calc}
\makeatletter
% #1: the axis (x,y or z)
% #2: the location where to place it.
\def\pgfplots@show@ticklabel@@#1#2{%
\pgf@process{#2}%
% define a leniency factor here, so we can remove all labels, which are
% \leniency* labeldim from the border.
\def\leniency{0.5}%
\setlength{\pgf@xa}{\widthof{\csname pgfplots@#1ticklabel\endcsname}}%
\setlength{\pgf@ya}{\heightof{\csname pgfplots@#1ticklabel\endcsname}}%
\pgfmathtruncatemacro\labelfits{
and(
and(
(\pgf@x-\leniency*\pgf@xa)>0,
(\pgf@picmaxx-\pgf@x-\leniency*\pgf@xa)>0
),
and(
(\pgf@y-\leniency*\pgf@ya)>0,
(\pgf@picmaxy-\pgf@y-\leniency*\pgf@ya)>0
))}%
\ifnum\labelfits=1%
% Typeset the label!
\pgfinterruptboundingbox
% What makes this complicated is the 'ticklabel cs' feature.
% What we need is to compute the MAXIMUM LENGTH over each tick
% label IN DIRECTION OF THE OUTER NORMAL.
%
% This needs to
% 1. enable bounding box computation even in case of
% 'overlay',
% 2. projection of the bounding box in direction of the outer
% normal,
% 3. update of the bounding box if 'overlay' is not active.
\begingroup
%
% prepare step (1.):
\pgfkeysalso{%
/tikz/every node/.append code={%
\ifpgf@relevantforpicturesize
\gdef\pgfplots@show@ticklabel@@update@BB{1}%
\else
\gdef\pgfplots@show@ticklabel@@update@BB{0}%
\fi
\pgf@relevantforpicturesizetrue
}%
}%
%
% Compute and remember the position '#2':
\pgf@process{#2}%
\edef\pgfplots@ticklabel@at@x{\the\pgf@x}%
\edef\pgfplots@ticklabel@at@y{\the\pgf@y}%
%
% ok, generate the label!
\node at (\pgfplots@ticklabel@at@x,\pgfplots@ticklabel@at@y) {\csname pgfplots@#1ticklabel\endcsname};%
%
% compute the label's dimensions, step (2.):
\pgfplots@ticklabel@maxtickdimen@updateforcurrentpath
{#1}
{\pgf@x=\pgfplots@ticklabel@at@x\space\pgf@y=\pgfplots@ticklabel@at@y\space}%%
%
% prepare step (3.): update of bounding box:
\if\pgfplots@show@ticklabel@@update@BB1%
\xdef\pgfplots@glob@TMPa{%
\pgf@xa=\the\pgf@picminx\space
\pgf@xb=\the\pgf@picminy\space
\pgf@ya=\the\pgf@picmaxx\space
\pgf@yb=\the\pgf@picmaxy\space
\noexpand\pgf@protocolsizes{\pgf@xa}{\pgf@xb}%
\noexpand\pgf@protocolsizes{\pgf@ya}{\pgf@yb}%
\noexpand\pgf@resetpathsizes
}%
\else
\global\let\pgfplots@glob@TMPa=\relax
\fi
\endgroup
\endpgfinterruptboundingbox
\begingroup
\pgfplots@glob@TMPa
\endgroup
\fi
}%
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=-10:10,
axis lines=middle,
]
\addplot {sin(deg(x/5))};
\end{axis}
\end{tikzpicture}
\end{document}
Best Answer
Ignore my comment
In
pgfplots.code.tex
line 6888-90This shows that this is intentionally designed to use
xticklables
as fallback ofextra x tick labels
.The workaround is simple, assign
extra x tick label
orextra x tick labels
.The expected behavior
@Dr. Manuel Kuehner suggests that the expected behavior is to simply print the x-coordinate. This makes more sense than I thought. In that case, we should replace the three lines by the following
By replace, I mean to edit
pgfplots.code.tex
or to redefine\pgfplots@init@ticks@for#1
.By the way, in the same file, if we look at line 6881-90, we see
translate to English
The logic behind is that, sometimes the user prefers 0cm, 1cm, and 5cm rather than
0
,1
, and5
. So the user may assignIn this case, the user probably want -4cm and -2cm instead of
-4
and-2
, so PGFPlots will inherit the formatting and add cm to extra labels.So the problem is, how to implement the following logic?
xticklabel
, treat extra labels as they are normal labels.xticklabels
, simply print the x-coordinate.You probably want to check if
\pgfplots@xticklabel
is empty. (Do you?)