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}
Here are two different ways of doing this (code at the bottom):
Using a "fake" bar plot (which is actually a scatter plot) with a color map with sharp transitions.

Using different \addplot
commands for each category, filtering out all the values not belonging to the current category.

The colour scheme is taken from the Colorbrewer website
Single \addplot
with color map:
\documentclass[11pt, border=5mm]{standalone}
\usepackage{pgfplots}
\definecolor{ylgnbu1}{RGB}{255, 255, 204}
\definecolor{ylgnbu2}{RGB}{161, 218, 180}
\definecolor{ylgnbu3}{RGB}{65, 182, 196}
\definecolor{ylgnbu4}{RGB}{44, 127, 184}
\definecolor{ylgnbu5}{RGB}{37, 52, 148}
\pgfplotsset{
colormap={colorbrewer-ylgnbu}{[1pt]
color(0pt)=(ylgnbu1);
color(85pt)=(ylgnbu1);
color(85pt)=(ylgnbu2);
color(135pt)=(ylgnbu2);
color(135pt)=(ylgnbu3);
color(195pt)=(ylgnbu3);
color(195pt)=(ylgnbu4);
color(285pt)=(ylgnbu4);
color(285pt)=(ylgnbu5);
color(630pt)=(ylgnbu5);
},
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
colorbar,
colorbar style={
major tick length=0pt,
ytick={4,11,16.5,24,46},
yticklabels={None,Minimal,Slightly,Medium heavy,Heavy}
},
point meta min=0, point meta max=63,
scatter,
scatter src=x,
only marks,
clip mode=individual,
scatter/@pre marker code/.append code={
\pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
\pgfmathsetmacro\negheight{-\pgfplotspointmeta}
\fill [draw=black] (axis direction cs:0,0.3) rectangle (axis direction cs:\negheight,-0.3);
\pgfplotsset{mark=none}
},
xmin=0,
width=12cm,
height=8cm,
xmajorgrids=true,
yticklabel={\#\ifnum\ticknum<9 0\fi\pgfmathprintnumber\tick},
ytick={1,2,...,10},
xmin=0,
xmax=36,
xtick={5,10,...,30},
xlabel={Sum},
ylabel={Participants},
%nodes near coords,
ymin=0.25,
ymax=10.75,
]![enter image description here][3]
\addplot coordinates
{(4,1) (16,2) (16,3) (33,4) (5,5) (10,6) (20,7) (8,8) (15,9) (5,10)};
\end{axis}
\end{tikzpicture}
\end{document}
Using separate \addplot
commands.
\documentclass[11pt, border=5mm]{standalone}
\usepackage{pgfplots, pgfplotstable}
\definecolor{ylgnbu1}{RGB}{255, 255, 204}
\definecolor{ylgnbu2}{RGB}{161, 218, 180}
\definecolor{ylgnbu3}{RGB}{65, 182, 196}
\definecolor{ylgnbu4}{RGB}{44, 127, 184}
\definecolor{ylgnbu5}{RGB}{37, 52, 148}
\pgfplotscreateplotcyclelist{colorbrewer-ylgnbu}{
{fill=ylgnbu1, draw=black},
{fill=ylgnbu2, draw=black},
{fill=ylgnbu3, draw=black},
{fill=ylgnbu4, draw=black},
{fill=ylgnbu5, draw=black},
}
\pgfplotstableread{
Sum Participants
4 1
16 2
16 3
33 4
5 5
8 6
20 7
8 8
15 9
5 10
}\datatable
\newcounter{plotindex}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xbar=0pt, bar shift=0pt,
cycle list name=colorbrewer-ylgnbu,
xmin=0,
width=12cm,
height=8cm,
xmajorgrids=true,
yticklabel={\#\ifnum\ticknum<9 0\fi\pgfmathprintnumber\tick},
ytick={1,2,...,10},
xmin=0,
xmax=36,
xtick={5,10,...,30},
xlabel={Sum},
ylabel={Participants},
ymin=0.25,
ymax=10.75,
legend entries={None,Minimal,Slightly, Medium heavy,Heavy},
legend cell align=left
]
\pgfplotsinvokeforeach{1,...,5}{
\addlegendimage{fill=ylgnbu#1,draw=black,area legend}
}
\pgfplotsinvokeforeach{0:8,9:13,14:19,20:28,29:63}{
\addplot +[restrict x to domain=#1] table {\datatable};
}
\end{axis}
\end{tikzpicture}
\end{document}
Best Answer
Using the color specification in the optional argument of
\addplot
(instead oftable
) seems to work: