PGFPlots : remplir l’aire entre deux courbes

Dans ce court billet, je vais vous montrer comment remplir l’aire sous une courbe avec PGFPlots, et surtout comment remplir l’aire entre deux courbes.

Problématique

Prenons un exemple minimal. Admettons que nous voulions remplir l’aire comprise entre les deux courbes de la figure suivante :

Plot

Remplir l’aire sous une courbe (ou plusieurs)

Pour cela, il suffit de préciser fill en option des addplot. Pour indiquer que le remplissage doit se faire depuis l’axe des abscisses, il faut ajouter la commande \closedcycle à la fin du \addplot.

\documentclass{minimal}
\usepackage{pgfplots}
	\pgfplotsset{compat=newest}
 
\begin{document}
	\begin{tikzpicture}
		\begin{axis}
			\addplot+[fill] coordinates {(0,2) (1,5) (2,5) (3,6)} \closedcycle;
			\addplot+[fill] coordinates {(0,1) (1,4) (2,3) (3,6)} \closedcycle;
		\end{axis}
	\end{tikzpicture}
\end{document}

FillVous noterez alors que l’ordre prend son importance, puisque les remplissages se superposent.

Remplir l’aire entre les deux courbes

Méthode crade

Pour ce faire, on va définir les ordonnées des points de la courbe bleue en fonction des celles de la courbe rouge, grâce à l’option stack plots=y, puis faire un \closedcycle, ce qui aura pour effet d’utiliser la première courbe comme limite inférieure, plutôt que l’axe des abscisses.

Du coup, pour définir les coordonnées des points de la courbe supérieure, il faudra retrancher les ordonnées de la seconde. On a donc :

\documentclass{minimal}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
 
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[ stack plots=y]
			\addplot coordinates {(0,1) (1,4) (2,3) (3,6)};
			\addplot+[fill] coordinates {(0,2-1) (1,5-4) (2,5-3) (3,6-6)} \closedcycle;
		\end{axis}
	\end{tikzpicture}
\end{document}

Ce qui nous donne :
Complet(le changement de couleur est dû à l’inversion de l’ordre des courbes)

Méthode classe

Les soustractions que l’on fait dans le code précédent sont supportables parce qu’on a 4 points… Si on a plus, ça laisse beaucoup de chance de se planter. On va donc demander à PGFPlots de faire lui même l’opération, après avoir défini une table de données :

\documentclass{minimal}
\usepackage{pgfplots}
	\pgfplotsset{compat=newest}
\usepackage{pgfplotstable}
 
\pgfplotstableread{
	0 1 2
	1 4 5
	2 3 5
	3 6 6
}\data
 
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[stack plots=y,stack plots=y]
			\addplot table {\data};
			\addplot+[fill] table [y expr=\thisrowno{2} - \thisrowno{1}] {\data} \closedcycle;
		\end{axis}
	\end{tikzpicture}
\end{document}

 Ici, on sélectionne chaque colonne grâce à la commande \thisrowno (la colonne 0 étant la première). Si rien n’est précisé pour l’axe x (resp. y), alors c’est la colonne 0 qui est lue (resp. 1).

Ajouter une courbe au milieu

Si vous tentez d’ajouter une courbe (sans remplissage) là dedans, alors elle sera cachée par le remplissage. Le plus simple est alors de définir un nouvel environnement axis en surcouche, comme je l’expliquais ici (avec juste un axis x line=none, axis y line=none en option).

Bonne compilation !