Dessiner un graphe de données ou de fonction dans un logiciel externe puis le coller comme image n’est pas nécessaire. LaTeX sait construire un tracé à partir des données directement dans le document. L’acteur principal est pgfplots, bâti sur TikZ/PGF. À partir d’une fonction, de coordonnées ou d’un fichier de données, il dessine courbes, nuages de points, diagrammes en barres et même surfaces 3D, avec les mêmes polices et les mêmes épaisseurs de trait que le texte. Cette page se concentre sur l’environnement axis de pgfplots et sur \addplot, puis couvre l’appel de gnuplot comme calculateur et l’import de graphiques produits avec R ou Python (matplotlib) sous forme de code TikZ.
Pourquoi composer les tracés dans le document
Coller un PNG produit par un tableur ou une application de dessin jure souvent avec le document : les étiquettes d’axe ont une police différente du corps, les équations deviennent des images floues, et les lignes crénellent à l’agrandissement. Si les données changent, il faut refaire et recoller la figure. pgfplots inverse la logique et laisse LaTeX composer le tracé lui-même. Les nombres des axes et la légende utilisent la même police que le texte, les courbes sont vectorielles et restent lisses à tout zoom, et une étiquette peut contenir de vraies mathématiques comme $\sin x$.
Un deuxième avantage est la séparation d’avec les données. Au lieu de coder les coordonnées en dur dans le texte, vous pointez pgfplots vers un fichier .dat ou .csv ; ensuite, mettre à jour les données et recompiler suffit pour que le tracé suive. Vous pouvez réutiliser les mêmes nombres dans un article, des diapositives et une annexe sans erreur de recopie. C’est exactement l’idée des tableaux construits à partir de données (voir les pages liées), et pgfplots fournit aussi le package frère pgfplotstable pour les tableaux.
pgfplots est construit sur TikZ/PGF ; la figure entière vit donc dans un environnement tikzpicture, et vous pouvez y mêler librement les coordonnées, nœuds et décorations propres à TikZ. Les bases de TikZ lui-même (\draw, le système de coordonnées, les nœuds) sont laissées à la page « TikZ basics » ; ici nous nous concentrons sur les tracés.
L’ossature de pgfplots — axis et \addplot
Commencez par le charger dans le préambule et déclarer un niveau de compatibilité. Écrire \pgfplotsset{compat=1.18} fixe le comportement par défaut de cette version (aspect des axes, placement des graduations, etc.), afin qu’une future mise à jour de pgfplots ne modifie pas vos figures en silence. Pour un nouveau document, on choisit généralement le numéro le plus récent permis par la version installée.
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}Dans le corps, placez un environnement axis dans un tikzpicture; chaque appel à \addplot à l’intérieur ajoute une courbe. Les axes, graduations, grilles et légende se règlent par les options de axis ; la couleur et les marqueurs de chaque courbe par les options de \addplot. Voici un exemple minimal.
\begin{tikzpicture}
\begin{axis}[
xlabel = {$x$},
ylabel = {$f(x)$},
title = {A parabola},
grid = major,
]
\addplot[blue, domain=-3:3, samples=100] {x^2};
\addlegendentry{$x^2$}
\end{axis}
\end{tikzpicture}Cela échantillonne la parabole y = x² en 100 points sur −3 ≤ x ≤ 3 et la trace comme une courbe bleue lisse. Les axes portent les étiquettes x et f(x), le titre « A parabola » apparaît en haut, grid=major place une grille légère sur les graduations principales, et \addlegendentry ajoute l’entrée de légende « x² ». Parcourons les points clés.
- Mettre étiquettes et titres entre accolades. Les écrire comme
xlabel={$x$}permet d’y placer sans risque des mathématiques ou des virgules. ^est la puissance ; la trigonométrie est en degrés par défaut. L’expression dans\addplot {x^2}est évaluée par le parseur interne de pgf. Les fonctions comme\sinprennent leur argument en degrés ; pour passer des radians, enveloppez avecsin(deg(x))etdeg().domainetsamples. Un tracé de fonction échantillonne l’intervalledomain=a:bensamples=Npoints (par défaut, environ −5:5 et 25 points). Si la courbe paraît anguleuse, augmentezsamples.- Deux façons de faire les légendes. Placez
\addlegendentry{…}après chaque courbe, ou écrivez-les ensemble dans les options deaxisaveclegend entries={A,B,...}. Positionnez-la aveclegend pos=north west, etc.
Les options axis les plus utilisées sont rassemblées ci-dessous. Elles se placent dans le [...] de axis, séparées par des virgules.
| Option | Rôle |
|---|---|
xlabel= / ylabel= | Étiquettes des axes x et y ; encadrer par des accolades comme xlabel={$x$}, mathématiques possibles |
title= | Un titre placé au-dessus du tracé |
xmin= xmax= ymin= ymax= | Fixer la plage visible (les limites d’axe) |
grid= | Tracer la grille : grid=major sur les graduations principales, grid=both aussi sur les secondaires |
legend pos= | Position de la légende : north west, etc. ; outer north east la place hors des axes |
xtick= | Indiquer où vont les graduations (p. ex. xtick={0,1,2}) ; xtick=data les aligne sur les données |
width= / height= | Définir les dimensions de la figure |
ybar | Créer un diagramme en barres verticales (plus bas) ; xbar pour l’horizontal |
Trois façons de fournir les données — fonction, coordonnées, fichier
\addplot accepte les données de trois grandes façons. La première, vue plus haut, est à partir d’une fonction : placez une expression dans {...} et pgfplots l’échantillonne sur domain pour former une courbe.
\addplot[red, domain=0:2*pi, samples=200] {sin(deg(x))};Cela trace une sinusoïde de 0 à 2π. Comme x est une valeur en radians, le point clé est l’enveloppe deg(), qui la convertit en degrés avant qu’elle n’atteigne \sin, lequel travaille en degrés.
La deuxième est à partir de coordonnées en ligne : listez des paires (x,y) dans coordinates {...} et pgfplots relie les points dans l’ordre, ou en fait un nuage de points avec seulement des marqueurs. Pratique pour quelques valeurs mesurées.
\addplot[mark=*, blue] coordinates {
(0,0) (1,1) (2,4) (3,9) (4,16)
};Ici, cinq points sont reliés par une ligne bleue, avec un marqueur circulaire plein (mark=*) à chacun. Pour supprimer la ligne et ne garder que les points, utilisez only marks ; changez le style de ligne avec dashed, etc.
La troisième, la plus importante en pratique, est à partir d’un fichier de données. table {filename} lit un fichier texte séparé par des espaces. La première ligne nomme les colonnes (l’en-tête), et par défaut pgfplots trace la colonne 1 comme x et la colonne 2 comme y. Supposons que vous ayez ce data.dat.
x y
0 0.0
1 0.8
2 0.9
3 0.1
4 -0.8
5 -1.0\begin{tikzpicture}
\begin{axis}[xlabel={$x$}, ylabel={$y$}, grid=major]
\addplot[mark=square, teal] table {data.dat};
% 列名で明示するなら:
% \addplot table[x=x, y=y] {data.dat};
\end{axis}
\end{tikzpicture}Pour être explicite, nommez les colonnes comme dans table[x=x, y=y] {data.dat} ; les noms sont sensibles à la casse. Pour un CSV séparé par des virgules, utilisez table[col sep=comma]{...} ; les lignes commençant par # ou % sont ignorées comme commentaires. Si vous devez remodeler les données ou créer des colonnes calculées, le package frère pgfplotstable est là (voir « Tables from data »).
Diagrammes en barres, axes logarithmiques et 3D
Le même cadre axis/\addplot permet de changer la représentation des données. Pour un diagramme en barres, donnez simplement l’option ybar à axis (barres verticales). Empilez plusieurs appels à \addplot et ils se décalent automatiquement en barres groupées.
\begin{tikzpicture}
\begin{axis}[
ybar,
xlabel = {Year}, ylabel = {Count},
symbolic x coords = {2023, 2024, 2025},
xtick = data,
]
\addplot coordinates {(2023,40) (2024,55) (2025,72)};
\end{axis}
\end{tikzpicture}Ici, les années (chaînes) servent d’étiquettes d’axe x via symbolic x coords, et xtick=data aligne les graduations sur chaque point de données. Pour des barres horizontales, utilisez xbar.
Les axes logarithmiques s’obtiennent simplement en remplaçant axis par un autre nom d’environnement : loglogaxis pour log–log, semilogxaxis pour un axe x logarithmique seulement, et semilogyaxis pour y seulement. Rien ne change dans le \addplot intérieur.
\begin{tikzpicture}
\begin{loglogaxis}[xlabel={$x$}, ylabel={$y$}]
\addplot[domain=1:1000, samples=50] {1/x};
\end{loglogaxis}
\end{tikzpicture}Pour la 3D, utilisez \addplot3 et axis devient automatiquement tridimensionnel. Indiquez surf pour une surface ou mesh pour un maillage, et écrivez la fonction avec les deux variables x et y. La 3D depuis des coordonnées ou un fichier de données passe par \addplot3 de la même façon.
\begin{tikzpicture}
\begin{axis}[xlabel={$x$}, ylabel={$y$}, zlabel={$z$}]
\addplot3[surf, samples=30, domain=-3:3]
{exp(-x^2 - y^2)};
\end{axis}
\end{tikzpicture}Cela trace la surface gaussienne en cloche z = e^(−x²−y²) sur une grille 30×30 comme surface colorée. Faites pivoter le point de vue avec view={azimuth}{elevation}.
Utiliser gnuplot comme calculateur
Le parseur propre à pgfplots est pratique, mais peut être limité pour des expressions complexes ou de nombreux échantillons. Écrire \addplot gnuplot {...} confie le calcul numérique au programme externe gnuplot, qui calcule les coordonnées ; pgfplots les relit ensuite et trace. En pratique, gnuplot sert de « calculatrice ».
\begin{tikzpicture}
\begin{axis}[xlabel={$x$}, ylabel={$y$}]
\addplot[blue] gnuplot[domain=0:10] {sin(x)};
\end{axis}
\end{tikzpicture}Deux précautions sont importantes. D’abord, --shell-escape est requis : comme LaTeX lance une commande externe (gnuplot), il faut compiler avec l’exécution de commandes externes activée, par exemple pdflatex --shell-escape document (aussi appelé -write18) ; sinon cela ne s’exécute pas. Pendant le traitement, des fichiers intermédiaires pour gnuplot sont créés, les résultats y sont écrits puis relus.
Ensuite, la syntaxe diffère : les expressions envoyées à gnuplot sont évaluées par son propre moteur mathématique. L’opérateur de puissance est donc le `** de gnuplot plutôt que le ^ de pgfplots, et les fonctions trigonométriques sont par défaut en **radians**. La « même » sinusoïde s’écrit donc {sin(deg(x))} avec le parseur intégré, mais {sin(x)} via gnuplot. Comme --shell-escape` est désactivé par défaut pour des raisons de sécurité, ne l’ajoutez que lorsque c’est nécessaire.
Importer des tracés depuis R et Python
Vous avez déjà fait l’analyse dans R ou Python et voulez réutiliser les graphiques, mais sans les défauts des images collées (polices différentes, équations floues). La solution consiste à faire émettre à chaque outil du code TikZ/pgfplots, afin que le tracé soit composé comme partie du document, avec des polices et des mathématiques assorties au corps.
Dans R, le package tikzDevice fournit un « périphérique graphique » qui écrit la sortie graphique standard de R, y compris les tracés base et ggplot2, sous forme de code TikZ. Ouvrez le périphérique avec tikz(), exécutez votre code de tracé habituel, puis fermez avec dev.off() pour obtenir un fichier .tex. Comme il interroge LaTeX sur les largeurs de chaînes et les métriques de police lors du placement du texte, la sortie correspond exactement à la police du corps, et les étiquettes d’axe peuvent contenir des mathématiques LaTeX. Avec standAlone=TRUE, il produit un document complet compilable séparément.
library(tikzDevice)
tikz("plot.tex", width = 4, height = 3)
plot(cars$speed, cars$dist,
xlab = "Speed", ylab = "Distance")
dev.off()En Python (matplotlib), tikzplotlib (anciennement matplotlib2tikz) convertit une figure créée avec matplotlib.pyplot en code pgfplots. Écrivez-la avec tikzplotlib.save("figure.tex") et incluez-la côté LaTeX avec \input{figure.tex}. Notez que tikzplotlib n’est plus maintenu ; un fork, matplot2tikz, est développé comme successeur. Pour un nouveau travail, envisagez matplot2tikz ; l’API est presque identique.
import matplotlib.pyplot as plt
import tikzplotlib # or: import matplot2tikz
plt.plot([0, 1, 2, 3], [0, 1, 4, 9])
plt.xlabel("$x$")
plt.ylabel("$x^2$")
tikzplotlib.save("figure.tex")Dans les deux cas, le .tex produit utilise pgfplots en interne ; le document doit donc aussi contenir \usepackage{pgfplots} et \pgfplotsset{compat=...}. Pouvoir retoucher à la main le code généré est un autre avantage absent d’un fichier image.
Performance et externalisation
pgfplots est élégant, mais lent et gourmand en mémoire sur de gros jeux de données : un nuage de dizaines de milliers de points peut allonger la compilation ou atteindre les limites mémoire de TeX. Plusieurs remèdes existent.
- Éclaircir les points. Tracez un point sur k avec
each nth point=k, ou éliminez les données hors plage avec des filtres commefilter discard if not. - Externalisation. Avec
\usepgfplotslibrary{external}et\tikzexternalize, chaque figure est compilée une fois dans son propre PDF puis simplement incluse, ce qui allège les recompilations du corps (nécessite--shell-escape). - Un moteur avec plus de mémoire.
LuaLaTeXa des limites mémoire plus souples et convient aux grandes figures. - Pré-rendre en amont. Si un tracé reste trop lourd, importer le résultat dessiné dans R, Python ou gnuplot (section précédente) peut être plus pratique.
Les fonctions qui nécessitent --shell-escape, comme l’externalisation ou gnuplot, doivent être activées lors des builds en CI ou en conteneur. Consultez la page liée sur Docker / CI setup.