Les graphiques sous TikZ

On a vu dans un précédent billet comment dessiner des figures vectorielles grâce à TikZ. Maintenant, on va s’intéresser à un autre point fort de TikZ, fourni par PGFPlots : la création de graphiques.

 

Exemple minimal

Tout se passe dans l’environnement axis (fourni par pgfplots), dans lequel on ajoute les tracés des courbes avec la commande \addplot (que je détaillerai par la suite). Voici donc un exemple de code minimal, et le rendu qui lui est associé :

\usepackage{pgfplots} % PGFPlots charge automatiquement TikZ
\begin{document}
	\begin{tikzpicture}
	  \begin{axis}
		\addplot coordinates {(0,0) (0.1,200) (0.2,300) (0.3,350) (0.4,375) }; % Tracé point à point
		\addplot expression[domain=0:0.5]{400*(1-exp(-5*x))}; % Équation analytique
	  \end{axis}
	\end{tikzpicture}
\end{document}
Graphique avec PGFPlots : cas minimal
Graphique avec PGFPlots : cas minimal

Personnalisation des axes et de la légende

Dans l’exemple précédent, on a laissé PGFPlots gérer le dimensionnement des axes. On peut bien sûr prendre la main dessus, et agrémenter le tout de quelques informations :

\usepackage{pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[	grid= major ,
				width=0.8\textwidth ,
				xlabel = {$\varepsilon$ (\%)} ,
				ylabel = {$\sigma$ (MPa)} ,
				xmin = 0, xmax = 0.5,
				ymin = 0, ymax = 400,
				legend entries={Courbe 1, Courbe 2},
				legend style={at={(0,1)},anchor=north west}]
			\addplot coordinates {(0,0) (0.1,200) (0.2,300) (0.3,350) (0.4,375) }; % Tracé point à point
			\addplot expression[domain=0:0.5]{400*(1-exp(-5*x))}; % Équation analytique
		\end{axis}
	\end{tikzpicture}
\end{document}
Exemple plus complet de graphique PGFPlots
Exemple plus complet de graphique PGFPlots

Sachez qu’il est possible de définir le nom de chaque courbe « à la volée », c’est à dire après chaque \addplot, grâce à la commande \addlegendentry. Le code suivant est donc strictement équivalent au précédent :

\begin{axis}[	grid= major ,
		width=0.8\textwidth ,
		xlabel = {$\varepsilon$ (\%)} ,
		ylabel = {$\sigma$ (MPa)} ,
		xmin = 0, xmax = 0.5,
		ymin = 0, ymax = 400,
		legend entries={, Courbe 2},
		legend style={at={(0,1)},anchor=north west}]
	\addplot coordinates {(0,0) (0.1,200) (0.2,300) (0.3,350) (0.4,375) }; % Tracé point à point
		\addlegendentry{Courbe 1}
	\addplot expression[domain=0:0.5]{400*(1-exp(-5*x))}; % Équation analytique
		\addlegendentry{Courbe 2}
\end{axis}

Utilisation des \addplot

Dans les exemples précédents, on a déjà vu deux moyens de définir une courbe : en lui donnant les coordonnées de chaque point ou en utilisant une expression mathématique. Mais il est aussi possible de lire un fichier de point.

Les valeurs doivent être en colonnes, séparées par des espaces ou des tabulations. Il est possible de désigner les colonnes par leurs numéros (la première étant 0) :

\addplot table[x index=0, y index=5] {data.txt};

Mais il est aussi possible de donner un nom plus explicite à chaque colonne, dans le fichier de données lui-même, en première ligne. PGFPlots ne lira les valeurs qu’à partir de la deuxième ligne. Exemple si on a pris le soin d’appeler intelligemment la première colonne « Deformation » et la deuxième « contrainte » :

\addplot table[x=Deformation, y=contrainte] {data.txt};

Options de addplot

Les options de chaque addplot doivent être précisées entre crochets. Exemple si on ne veut pas de marqueur et tracer la courbe en bleu, de largeur 1 point :

\addplot[mark=none, draw=blue, line width=1pt]

Si vous ne voulez spécifier que certaines options, et laisser PGFPlots gérer le reste (par exemple ne spécifier que l’épaisseur mais laisser PGFPlots utiliser ses couleurs par défaut), il suffit de rajouter un « + » entre addplot et lesdites options :

\addplot+[<options>]

Ajouter des annotations

On retrouve bien sûr toutes les commandes propres à TikZ, mais il faut penser à préciser « axis cs : » avant les coordonnées, pour que TikZ fasse la correspondance entre les coordonnées suivant les axes et les coordonnées effectives (en cm). La commande pin sert précisément à ajouter des annotations :

\node at (axis cs:306,127) [pin={-45:Good point!},inner sep=0pt] {};

Le « -45 » de mon exemple donne l’angle entre le pointeur et l’horizontale.

 

Options supplémentaires pour les axes

Il est bien sûr possible de dessiner des graphiques en coordonnées semi-logarithmiques ou logarithmiques :

\begin{semilogxaxis}
  ...
\end{semilogxaxis}
\begin{loglogaxis}
  ...
\end{loglogaxis}

On peut imposer chaque valeur affichée d’un axe grâce à la commande xtick, en option de axis, à qui on donne la liste exhaustive des valeurs à afficher sur un axe :

xtick={8,16,24,32,40,48,56,64}

Pour aller plus loin

On peut bien sûr lire la documentation officielle de pgfplots pour des informations exhaustives. Plus sobrement, je conseille les fiches de Bébert (en français)  qui proposent déjà une approche assez poussée.

Si vous cherchez des exemple de graphiques : allez faire un tour de ce coté là.

Bonne compilation !

Les graphiques sous TikZ
4.4 (88 %) 5 votes
  • Pingback: Des graphiques like a boss | Le Blog de DorianLe Blog de Dorian()

  • Pingback: Graphiques PFGplots : légendes complètement cheatées et boucles for - Le Blog de Dorian()

  • Frédéric

    Bonjour,
    Je me suis lancé dans les graphiques en courbes avec TikZ et pgfplots. J’arrive à faire un graphique avec deux courbes, en saisissant mes données dans mon fichier .tex : assez fastidieux quand les séries sont longues.
    J’ai vu qu’il était possible d’appeler un fichier .txt ou même .cvs, ce qui simplifie grandement le travail, mais impossible de construire un graphique. Voilà ce que je fais (en ne prenant qu’une série, appelée ici « Produits_alimentaires », alors que j’en ai quatre autres) :
    \begin{axis}
    [axis x line=bottom,
    axis y line=left,
    xscale=1.3,
    ymajorgrids,
    title={Titre du graphe}]

    \addplot table[x index=1,y=Produits_alimentaires]{serie.txt};

    \end{axis}

    Bref, comment faire ?
    Merci de vos explications.

    À bientôt,
    Frédéric

  • Frédéric

    Ça y est : j’ai réussi. J’ai utilisé un fichier .csv (et non .txt, mais ça doit aussi marcher, selon Bébert), et modifier le code :
    \begin{axis}
    [axis x line=bottom,
    axis y line=left,
    xscale=1.3,
    ymajorgrids,
    title={Titre du graphe}]

    \addplot table [x index=0,y=Produits_alimentaires]{serie.csv};
    \addplot table [x=Annee,y=Viande]{serie.csv};
    \addplot table [x=Annee,y=Produits_laitiers]{serie.csv};
    \addplot table [x=Annee,y=Cereales]{serie.csv};
    \addplot table [x=Annee,y=Huiles_veg]{serie.csv};
    \addplot table [x=Annee,y=Sucre]{serie.csv};

    \end{axis}

    Nouveau problème : les années (en milliers) sont notées 2,014 (par ex.).
    Mais il me semble qu’il y a un paquet de francisation qui existe avec Beamer : \uselanguage{French} et \languagepath{French}. Eh non : ça ne marche pas…

    Une idée ?

    • Salut !
      Pour ton problème de mise en forme des années, tu as deux solutions :
      – considérer que les années sont bien des nombre, mais empêcher leur mise en forme. Dans ce cas tu peux essayer ça en option de ton axis (voir ici) :
      /pgf/number format/.cd,
      use comma,
      1000 sep={},

      – renommer manuellement les labels de l’axe x :
      xtick={2000,2001,2002,2003,2004},
      xticklabels={2000,2001,2002,2003,2004}

      Le principe est ici de remplacer le nombre « 2000 » par l’expression « 2000 » et ainsi de suite. Donc sauf erreur de ma part, PGFPlots ne devrait pas interpréter les xticklabels comme des nombres, donc ne pas les mettre en forme.

      Bon week-end !

  • Pingback: Export de données Matlab pour PGFPlots | Le Blog de Dorian()