Des graphiques like a boss

On sait depuis longtemps que grâce à TikZ/pgfplots, il est possible de réaliser des graphiques visuellement irréprochables, avec une cohérence parfaite avec le reste du document $latex \LaTeX$. Dans ce billet, je vais vous donner quelques tuyaux pour parfaire le rendu et, par là même, prouver aux derniers TikZ-sceptiques que les applications sont sans limite.

 

Ajouter des barres d’erreur

Exemple

Barres d'Erreur

Code Associé

\begin{tikzpicture}
  \begin{axis}[grid= major ,
      width=0.8\textwidth,
      height=0.4\textheight,
      xlabel = {Position} ,
      ylabel = {Valeur},
      xmin = 0, xmax = 4,
      ymin = 320, ymax = 360,
      legend entries={Courbe A,Courbe B},]
    \addplot+[smooth, error bars/.cd,y dir=both,y explicit] table[x=Pos, y=Hlon, y error=eclon] {009.csv};
    \addplot+[smooth, error bars/.cd,y dir=both,y explicit] table[x=Pos, y=Htra, y error=ectra] {009.csv};
  \end{axis}
\end{tikzpicture}

Remarques

Dans l’exemple ci-dessus, les valeurs des colonnes « eclon » et « ectra » du fichier 009.csv servent à dessiner les barres d’erreur de chaque point. L’option y dir=both sert à indiquer que les barres sont à dessiner de chaque coté des points considérés.

 

Séparer deux légendes

Exemple

Deux legendes sur un même graphe

Code associé

\begin{tikzpicture}
  \begin{axis}[grid= major ,
      width=0.8\textwidth,
      height=0.3\textheight,
      xlabel = {Temps (min)},
      ylabel = {$\Sigma$}]
    \addplot+[smooth] table[x=Temps, y=Ext] {700.txt};
       \label{plot:700ext}
    \addplot+[smooth] table[x=Temps, y=Int] {700.txt};
      \label{plot:700int}
    \addplot+[smooth] table[x=Temps, y=Ext] {650.txt};
       \label{plot:650ext}
    \addplot+[smooth] table[x=Temps, y=Int] {650.txt};
      \label{plot:650int}
  \end{axis}
  \node [draw,fill=white] at (rel axis cs: 0.8,0.25) {\shortstack[l]{
     Cas A :\\
        \ref{plot:700ext} Simu 1 \\
        \ref{plot:700int} Simu 2}};
  \node [draw,fill=white] at (rel axis cs: 0.85,0.8) {\shortstack[l]{
     Cas B :\\
        \ref{plot:650ext} Simu 1 \\
        \ref{plot:650int} Simu 2}};
\end{tikzpicture}

Remarque

Pour dessiner ces deux légendes, on feinte en n’utilisant pas le système de légendage de pgfplots, mais en les dessinant « à la main ». La méthode est toutefois intéressante : on donne un label à chaque courbe, puis on en fait référence, comme on ferait pour une figure.  Par extension, sachez qu’on peut donc donner un label à n’importe quelle courbe, puis en faire référence où bon nous semble dans le document pour placer une image de la courbe.

 

Axes Y de part et d’autre du graphique

Exemple

Deux axes Y différents

Code associé

\begin{tikzpicture}
	\begin{axis}[width=0.6\textwidth,
		axis y line*=left,
		y axis line style=blue,
		xlabel={Taille (mm)},
		ylabel={Hv},
		xmin=1, xmax=5.5,
		legend pos= south west]
			\addplot+[only marks, mark=x,blue] coordinates{
			(1.05,3384/9.81)
 			(2.86,3139/9.81)
			(4.28,3110/9.81)
			(5.3,2933/9.81)};
			\addlegendentry{Expérimentales}
		\addplot[draw=blue,domain=1.05:5.3]{
		(0.065*(912+326/sqrt(x)) + 0.6*ln( 110000/ (912+326/sqrt(x) ) )*(912+326/sqrt(x)))/9.81
	};
			\addlegendentry{Analytiques}
	\end{axis}
	\begin{axis}[
		width=0.6\textwidth,
		axis y line*=right,
		y axis line style=red,
		axis x line=none,
		ytick=\empty
		xmin=1, xmax=5.5,
		ylabel={$\sigma_y$ (MPa)}]
		\addplot[draw=red,domain=1:5.5]{912+326/sqrt(x)};
	\end{axis}
\end{tikzpicture}

Remarques

L’astuce est ici de superposer deux environnements axis, mais de n’afficher qu’une fois l’axe x. Vérifiez bien donc que les gammes pour les abscisses sont les mêmes ! De plus, le placement de l’axe Y à droite (en rouge dans mon exemple) nécessite d’avoir chargé dans le préambule la commande suivante :

\pgfplotsset{compat=1.3}

 

 

Diagrammes en barres

Exemple

Deux série de données en barre

Code associé

\begin{tikzpicture}
  \begin{axis}[ybar ,
             width=0.7\textwidth,
             bar width=5pt,
             height=0.25\textheight,
             xlabel = {Disorientation angle},
             ylabel = {Fraction},
             xmin=0, xmax=96,
             ymin=0,
             legend entries={Echantillon A,Echantillon B},
                 legend style={at={(0,1)},anchor=north west}]
    \addplot table[x=Angle, y=col1] {Distrodesorient.txt};
    \addplot table[x=Angle, y=col2] {Distrodesorient.txt};
  \end{axis}
\end{tikzpicture}

 

 

Affichage correct des nombres suivant la typographie française

Nous francophones avons l’habitude de séparer les décimales par une virgule, et les milliers par des espaces. Ce qui n’est pas le cas en typo anglophone (points et apostrophes, respectivement), utilisée par défaut dans pgfplots. Pour corriger cette erreur, il faut donc rajouter aux options des axis :

/pgf/number format/.cd,
use comma,
1000 sep={\,},

Note : La commande « \, » sous $latex \LaTeX$ est une espace fine, conformément à la typographie française.