Comment faire de beaux graphiques avec TikZ et PGFPLOTS
et si vous êtes sages on fera peut-être des camemberts.
— Et bien non on ne fera pas de camemberts.
— Ben pourquoi ?
— Parce que c’est moche et ça sert à rien.
Le but de ce tutoriel est d’apprendre à réaliser des graphiques à l’aide de TikZ et PGFPLOTS. Pourquoi ne pas utiliser un logiciel spécialisé comme un tableur ? Il y a plusieurs raisons :
l’exportation d’un graphique fait à l’aide d’un tableur en un document compris par LaTeX n’est pas toujours aisé et tu te retrouves souvent à exporter ton graphique sous un format image, qui perd beaucoup en qualité ;
l’insertion dans LaTeX notamment au niveau de l’échelle, n’est pas toujours heureuse. Tu es amené à souvent réduire sa taille, rendant souvent des parties du graphique illisibles (taille de caractère trop petite, pixelisation,. . .) ;
tu perds la continuité typographique de ton document (polices différentes).
Donc pour des graphiques parfaitement intégrés à ton document, utilise le couple TikZ et PGFPLOTS, en plus ce n’est guère plus compliquer à utiliser qu’un tableur.
Dans cette fiche on va se limiter à des opérations de base, on se contentera
de graphique simple avec un minimum de réglages.
Pour commencer
Pour illustrer notre propos nous allons utiliser les précipitations et les
températures relevées dans la région lilloise pour le mois de décembre 2004.
Les deux premières choses à faire c’est de charger les packages TikZ et PGFPLOTS :
\usepackage{tikz} \usepackage{pgfplots}
Si tu es sous ConTeX :
\usemodule[pgfplots]
Le module TikZ est chargé automatiquement.
Maintenant nous allons commencer notre graphique. Tu ouvres un environnement TikZ :
\begin{tikzpicture} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \stoptikzpicture
Pour être lisible un graphique se doit d’avoir des axes, ce que tu vas réaliser grâce à l’environnement axis. Comme tu ne lui as encore précisé aucune donnée PGFPLOTS affiche un truc par défaut avec des coordonnées comprise entre 0 et 1 :
\begin{tikzpicture} \begin{axis}
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis
\stopaxis \stoptikzpicture
Taille du graphique
Évidement l’environnement axis accepte des options.
Attention les options sont séparées par des virgules.
Je te rappelle que tu peux jouer aussi avec les options liées à tikzpicture
pour adapter ton graphique à ton document :
\begin{tikzpicture}[scale=0.5]
. . .
Sous ConTeXt :
\starttikzpicture[scale=0.5] . . .
N’afficher que deux côtés du graphique
\begin{tikzpicture} \begin{axis}[axis x line=bottom,axis y line = left]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[axis x line=bottom,axis y line = left]
\stopaxis \stoptikzpicture
Dans l’autre sens :
\begin{tikzpicture} \begin{axis}[axis x line=top,axis y line = right]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[axis x line=top,axis y line = right]
\stopaxis \stoptikzpicture
Si tu fais bien attention tu peux te rendre compte que PGFPLOTS en même temps qu'il supprime un côté,
supprime aussi l'espace avant la première donnée (ici les coordonnées 0,0 sont collées à l'origine alors qu'elles
ne l'était pas auparavant)
Ceci peut être génant notament lors de graphes batons. Voici un petit exemple pour te montrer la chose :
\begin{tikzpicture} \begin{axis}[axis x line=bottom,axis y line = left] \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates {
(1,194) (2,213) (3,251)(4,233) (5,194)};
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[axis x line=bottom,axis y line = left] \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates {
(1,194) (2,213) (3,251)(4,233) (5,194)};
\stopaxis \stoptikzpicture
Oups ! deux colonnes ont disparues. Pour corriger cela il faut augmenter la taille des axes avec l'option enlargelimits qui accepte plusieurs valeurs
La première valeur est true qui augmente automatiquement la taille des axes :
\begin{tikzpicture} \begin{axis}[axis x line=bottom,axis y line = left,enlargelimits=true] \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates {
(1,194) (2,213) (3,251)(4,233) (5,194)};
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[axis x line=bottom,axis y line = left,enlargelimits=true] \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates {
(1,194) (2,213) (3,251)(4,233) (5,194)};
\stopaxis \stoptikzpicture
Tu peux lui attribuer une valeur numérique comme 0.2 qui augmente la taille des axes de 20%
\begin{tikzpicture} \begin{axis}[axis x line=bottom,axis y line = left,enlargelimits=0.2] \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates {
(1,194) (2,213) (3,251)(4,233) (5,194)};
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[axis x line=bottom,axis y line = left,enlargelimits=0.2] \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates {
(1,194) (2,213) (3,251)(4,233) (5,194)};
\stopaxis \stoptikzpicture
Tu peux également lui attribuer une valeur absolue comme 10mm :
\startaxis[axis x line=bottom,axis y line = left,enlargelimits={abs=10mm}]
Les autres valeurs possibles sont : auto, false et upper et lower qui gèrent un seul côté de l'axe
Tu peux également modifier séparément les axes avec enlarge x limits, enlarge y limits, enlarge z limits qui acceptent les mêmes valeurs que enlargelimits.
Tu peux également combiner les valeurs par exemple pour augmenter de 20% la partie inférieure des axes :
\startaxis[axis x line=bottom,axis y line = left, enlargelimits={rel=0.2,lower}]
Je te laisse essayer.
Ajouter une grille
\begin{tikzpicture} \begin{axis}[grid=major]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[grid=major]
\stopaxis \stoptikzpicture
Ajouter une grille uniquement pour les x
\begin{tikzpicture} \begin{axis}[xmajorgrids]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[xmajorgrids]
\stopaxis \stoptikzpicture
Ajouter une grille uniquement pour les y
\begin{tikzpicture} \begin{axis}[ymajorgrids]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[ymajorgrids]
\stopaxis \stoptikzpicture
Ajouter un label pour les x ou les y
\begin{tikzpicture} \begin{axis}[xlabel={L’axe des x},ylabel={L’axe des y}]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[xlabel={L’axe des x},ylabel={L’axe des y}]
\stopaxis \stoptikzpicture
Ajouter un titre pour ton graphique
\begin{tikzpicture} \begin{axis}[title={Le titre du graphique}]
\end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[title={Le titre du graphique}]
Le système de coordonnées est le même que celui de TikZ, voir TikZ, le système de coordonnées et les chemins (path).
Je te rappelle que les décimales sont notées à l’anglo-saxonne avec un point.
Comme toutes commande TikZ, n’oublie pas le ; à la fin \addplot coordinates {. . .};
Avec un titre et des labels :
\begin{tikzpicture} \begin{axis}[xlabel={heures},ylabel={\degres C},
title={Températures relevées à Lille le 16 décembre 2004}] \addplot coordinates {
(0,2.6) (1,2.5) (2,2.6) (3,2.3) (4,2.2) (5,2.3) (6,3.1) (7,3.3) (8,3.3)
(9,3.8) (10,3.8) (11,4.2) (12,4.8) (13,5) (14,5.7) (15,6.2) (16,6.8) (17,7.1)
(18,7.6) (19,7.7) (20,7.2) (21,6) (22,5.6) (23,6.3)}; \end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture\startaxis[xlabel={heures},ylabel={\textcelsius},
title={Températures relevées à Lille le 16 décembre 2004}] \addplot coordinates {
(0,2.6) (1,2.5) (2,2.6) (3,2.3) (4,2.2) (5,2.3) (6,3.1) (7,3.3) (8,3.3)
(9,3.8) (10,3.8) (11,4.2) (12,4.8) (13,5) (14,5.7) (15,6.2) (16,6.8) (17,7.1)
(18,7.6) (19,7.7) (20,7.2) (21,6) (22,5.6) (23,6.3)}; \stopaxis \stoptikzpicture
ConTeXt à la commande \textcelsius pour écrire °C (et \textdegree pour uniquement le °) alors que sous LaTeX il faut écrire \degres C
Alors il n’est pas joli notre graphique et pas si compliqué à faire. Bon il y a quand même un petit problème. Si la 25e heure et très cinématographique, elle n’a rien de scientifique. Il faut donc donner à PGFPLOTS des limites.
\starttikzpicture \startaxis[xlabel={heures},ylabel={\textcelsius},
title={Températures relevées à Lille le 16 décembre 2004},
xmax=24] \addplot coordinates {
(0,2.6) (1,2.5) (2,2.6) (3,2.3) (4,2.2) (5,2.3) (6,3.1) (7,3.3) (8,3.3)
(9,3.8) (10,3.8) (11,4.2) (12,4.8) (13,5) (14,5.7) (15,6.2) (16,6.8) (17,7.1)
(18,7.6) (19,7.7) (20,7.2) (21,6) (22,5.6) (23,6.3)}; \stopaxis \stoptikzpicture
Enlever les marges
Tu as remarqué que PGFPLOTS ajoute des marges entre les axes et le
graphique. Si tu veux les supprimer tu utilises l’option enlarge x limits=false. Note que dans ce cas tu n’as plus besoin de mettre xmax=24,
puisque les axes s’arrête aux limites du graphique. Il existe également un
enlarge y limits=false, pas très utile dans notre exemple.
\begin{tikzpicture} \begin{axis}[enlarge x limits=false,
xlabel={heures},
ylabel={\degres C},
title={Températures relevées à Lille le 16 décembre 2004}] \addplot coordinates {
(0,2.6) (1,2.5) (2,2.6) (3,2.3) (4,2.2) (5,2.3) (6,3.1) (7,3.3) (8,3.3)
(9,3.8) (10,3.8) (11,4.2) (12,4.8) (13,5) (14,5.7) (15,6.2) (16,6.8) (17,7.1)
(18,7.6) (19,7.7) (20,7.2) (21,6) (22,5.6) (23,6.3)}; \end{axis} \end{tikzpicture}
Sous ConTeXt :
\starttikzpicture \startaxis[enlarge x limits=false,
xlabel={heures},
ylabel={\textcelsius},
title={Températures relevées à Lille le 16 décembre 2004}] \addplot coordinates {
(0,2.6) (1,2.5) (2,2.6) (3,2.3) (4,2.2) (5,2.3) (6,3.1) (7,3.3) (8,3.3)
(9,3.8) (10,3.8) (11,4.2) (12,4.8) (13,5) (14,5.7) (15,6.2) (16,6.8) (17,7.1)
(18,7.6) (19,7.7) (20,7.2) (21,6) (22,5.6) (23,6.3)}; \stopaxis \stoptikzpicture
Changer l’aspect du graphique
Sympa cette couleur bleue avec les petits ronds comme marqueur, mais comment on fait pour changer ?
Deux possibilités, soit tu veux tout changer, soit tu veux ajouter une modification, comme par exemple supprimer
les marqueurs tout en gardant la couleur bleue. Dans le premier cas tu utilises \addplot[options] et
dans le deuxième \addplot+[options]. Voici 3 exemples du même graphique :