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}
Your example appears to consist of a lot of custom drawing instructions which make up the box plot -- and the actual box (which seems to be relevant for the legend) is a \draw
statement.
In this case, it appears to be appropriate to use \addlegendimage
combined with \addlegendentry
in order to actually draw the legend - and to provide forget plot
to every \addplot
command:
\documentclass{amsart}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
\usetikzlibrary{plotmarks}
\begin{document}
\definecolor{mycolor1}{rgb}{0.6,0.8,1}
\definecolor{mycolor2}{rgb}{0,0.2,0.6}
\begin{tikzpicture}
\begin{axis}[%
width=4.52083333333333in,
height=3.565625in,
scale only axis,
xmin=0.5, xmax=1.5,
xtick={1},
xticklabels={Direct Care,Housekeeping,Mealtimes,Medication Round,Miscellaneous,Personal Care},
ymin=-2, ymax=5,
ylabel={Normalised cfu (Y) values},
legend style={draw=black,fill=white,legend cell align=left}
]
\addplot [
forget plot,
color=black,
dotted
]
table{
0.825 5
0.825 2
};
;
\addplot [
forget plot,
color=black,
solid
]
table{
0.755 5
0.895 5
};
;
\addplot [
forget plot,
color=black,
solid
]
table{
0.755 2
0.895 2
};
;
\draw[solid, fill=mycolor1, draw=black] (axis cs:0.685, 3) rectangle (axis cs:0.965, 4);
\addlegendimage{area legend,fill=mycolor1,draw=black}
\addlegendentry{4 ACH};
;
\addplot [
forget plot,
color=black,
solid,
line width=1.0pt
]
table{
0.685 3
0.965 3
};
;
\addplot [
forget plot,
color=blue,
only marks,
mark=*,
mark options={solid,fill=mycolor1,draw=black}
]
table{
0.825 3.56
};
;
\addplot [
forget plot,
color=black,
dotted
]
table{
1.175 5
1.175 -2
};
;
\addplot [
forget plot,
color=black,
solid
]
table{
1.105 5
1.245 5
};
;
\addplot [
forget plot,
color=black,
solid
]
table{
1.105 -2
1.245 -2
};
\draw[solid, fill=mycolor2, draw=black] (axis cs:1.035, 0) rectangle (axis cs:1.315, 3);
\addlegendimage{area legend,fill=mycolor2,draw=black}
\addlegendentry{6 ACH};
\addplot [
forget plot,
color=black,
solid,
line width=1.0pt
]
table{
1.035 2
1.315 2
};
\addplot [
forget plot,
color=blue,
only marks,
mark=*,
mark options={solid,fill=mycolor2,draw=black}
]
table{
1.175 1.59
};
\end{axis}
\end{tikzpicture}%
\end{document}
Best Answer
I'll give here a general example how you can do this. The trick is to first define a
colormap
and then to convert thiscolormap
to acycle list
. For other stuff you can then access the colors of thecolormap
with the new featureindex of colormap
which was introduced in PGFPlots v1.13.For more details have a look at the comments in the code.