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.
Table des matières
Problématique
Prenons un exemple minimal. Admettons que nous voulions remplir l’aire comprise entre les deux courbes de la figure suivante :
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} |
Vous 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 :
(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 !