# Area between curves tikz [duplicate]

This question already has an answer here:

I am trying to plot a graph using tikz, but I can't seem to be able to highlight the areas between the curves. The result should look something like this: This is the code I have so far:

\begin{center}
\begin{tikzpicture}[scale=0.8]

\draw[->] (0,-0.5) -- (0,4.5) node[anchor=east] {};
\draw[->] (-0.5,0) -- (9,0) node[anchor=north] {};
\draw   (1,-0.2) node[anchor=north] {$a$}
(8,-0.2) node[anchor=north] {$b$}
;
\filldraw[fill=black!10](1,0)--(1,2)--(8,2)--(8,0);
\draw [](1,3) parabola bend (2.5,1.5)(4.2,2.4);
\draw [](4.2,2.4) parabola bend (5.5,3)(8,0);
\draw[] (1,0)--(1,3);
\end{tikzpicture}
\end{center}


The end result I would like to achieve is to have C and D higlighted in orange, while A and B in a dark grey. Don't worry about the axes labels or else, I mostly need help with the shading.

Thanks in advance!!

## marked as duplicate by Werner, jub0bs, Sean Allred, zeroth, Peter JanssonMar 6 '14 at 19:22

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

## 2 Answers

For this, I'd suggest you to use the pgfplots package and stacking plots:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}

\pgfmathdeclarefunction{poly}{0}{%
\pgfmathparse{-x^3+5*(x^2)-3*x-3}%
}

\begin{tikzpicture}
\begin{axis}[
domain=-1.2:4.2,
ymin=-5,
ymax=10,
samples=160,
stack plots=y
]
% draw graph for the first function f
\addplot+[black,thick,mark=none] {poly};
% draw graph of max(g-f, 0) and stack
\addplot+[mark=none,fill=gray!60,draw=cyan] {max(3-(poly),0)} \closedcycle;
% draw graph of min(g-f, 0) and stack
\addplot+[mark=none,fill=orange!70,draw=cyan] {min(3-(poly),0)} \closedcycle;
\end{axis}
\end{tikzpicture}

\end{document} And with the help lines and labels:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}

\pgfmathdeclarefunction{poly}{0}{%
\pgfmathparse{-x^3+5*(x^2)-3*x-3}%
}

\begin{tikzpicture}
\begin{axis}[
xmin=-2,
xmax=5,
ymin=-5,
ymax=10,
axis y line=left,
axis x line=bottom,
xtick={-1.2,2,4.2},
xticklabels={$a$,$\zeta$,$b$},
ytick={3},
yticklabels={$f(\zeta)$},
samples=160
]

\addplot[mark=none,help lines,domain=-2:4.2] {3};

% draw graph for the first function f
\addplot+[black,thick,mark=none,domain=-1.2:4.2,stack plots=y] {poly};
% draw graph of max(g-f, 0) and stack
\addplot+[mark=none,fill=gray!60,draw=cyan,domain=-1.2:4.2,stack plots=y] {max(3-(poly),0)} \closedcycle;
% draw graph of min(g-f, 0) and stack
\addplot+[mark=none,fill=orange!70,draw=cyan,domain=-1.2:4.2,stack plots=y] {min(3-(poly),0)} \closedcycle;

\draw[help lines] (axis cs:-1.2,-5) -- (axis cs:-1.2,3);
\draw[help lines] (axis cs:2,-5) -- (axis cs:2,3);
\draw[help lines] (axis cs:4.2,-5) -- (axis cs:4.2,3);
\end{axis}
\end{tikzpicture}

\end{document} Gonzalo's idea with stacking plots is clever. And now there's a new way, with pgfplots 1.10 and its fillbetween library:

• draw the polygon function and give it a name
• draw the line (or any other function) and name it too
• add a fill between plot

The essence:

\usepgfplotslibrary{fillbetween}
...
\addplot[name path=poly,black,thick,mark=none,domain=-1.2:4.2,stack plots=y] {poly};
\addplot[name path=line,gray,no markers,line width=1pt,domain=-1.2:4.2] {3};
\addplot fill between[
of = poly and line,
split, % calculate segments
every even segment/.style = {orange!70},
every odd segment/.style  ={gray!60}
]; Complete example:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}
\usepgfplotslibrary{fillbetween}
\begin{document}

\pgfmathdeclarefunction{poly}{0}{%
\pgfmathparse{-x^3+5*(x^2)-3*x-3}%
}

\begin{tikzpicture}
\begin{axis}[
xmin=-2,
xmax=5,
ymin=-5,
ymax=10,
axis y line=left,
axis x line=bottom,
xtick={-1.2,2,4.2},
xticklabels={$a$,$\zeta$,$b$},
ytick={3},
yticklabels={$f(\zeta)$},
samples=160
]

\addplot[name path=poly,black,thick,mark=none,domain=-1.2:4.2,stack plots=y] {poly};
\addplot[name path=line,gray,no markers,line width=1pt,domain=-1.2:4.2] {3};
\addplot fill between[
of = poly and line,
split, % calculate segments
every even segment/.style = {orange!70},
every odd segment/.style  ={gray!60}
];
\end{axis}
\end{tikzpicture}

\end{document}