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.

Fleuron

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 :

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

exemple1

Taille du graphique

Évidement l’environnement axis accepte des options.

Attention les options sont séparées par des virgules.

Tu peux jouer sur la taille du graphique :

\begin{tikzpicture}
\begin{axis}[height=8cm,width=5cm]

\end{axis}
\end{tikzpicture}

Sous ConTeXt :

\starttikzpicture
\startaxis[height=8cm,width=5cm]

\stopaxis
\stoptikzpicture

exemple2

d’autre exemples :

\begin{tikzpicture}
\begin{axis}[scale=0.5]

\end{axis}
\end{tikzpicture}

Sous ConTeXt :

\starttikzpicture
\startaxis[scale=0.5]

\stopaxis
\stoptikzpicture

exemple3

\begin{tikzpicture}
\begin{axis}[xscale=0.7, yscale=0.4]

\end{axis}
\end{tikzpicture}

Sous ConTeXt :

\starttikzpicture
\startaxis[xscale=0.7, yscale=0.4]

\stopaxis
\stoptikzpicture

exemple4

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

exemple5

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

exemple6

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}[]
\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[]
\addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates { (1,194) (2,213) (3,251)(4,233) (5,194)}; \stopaxis
\stoptikzpicture

Un graphe baton

Maintenant si j'enlève deux côtés

\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

Un graphe baton

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

Un graphe baton

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

Un graphe baton

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

exemple7

Ajouter une grille uniquement pour les x

\begin{tikzpicture}
\begin{axis}[xmajorgrids]

\end{axis}
\end{tikzpicture}

Sous ConTeXt :

\starttikzpicture
\startaxis[xmajorgrids]

\stopaxis
\stoptikzpicture

exemple8

Ajouter une grille uniquement pour les y

\begin{tikzpicture}
\begin{axis}[ymajorgrids]

\end{axis}
\end{tikzpicture}

Sous ConTeXt :

\starttikzpicture
\startaxis[ymajorgrids]

\stopaxis
\stoptikzpicture

exemple9

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

exemple10

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}]

\stopaxis
\stoptikzpicture

exemple11

Ajouter des données

\begin{tikzpicture}
\begin{axis} \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 \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

exemple12

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

exemple13

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.

Limites du graphique

Tu les fixes par xmin, xmax, ymin, ymax.

\begin{tikzpicture}
\begin{axis}[xlabel={heures},ylabel={\degres C},
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)};
\end{axis}
\end{tikzpicture}

Sous ConTeXt :

\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

exemple13

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

exemple14

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 :

\addplot[]

exemple15

\addplot[mark=none]

exemple16

\addplot+[mark=none]

exemple17