De beaux graphiques dans Latex

dimanche 29 janvier 2012, par jps29

Quand on écrit sa thèse avec Latex ou plus exactement XeLateX, le rendu typographique est superbe. Cependant, si on y intègre des graphiques faits avec R, les polices de caractère ne correspondent pas et c’est assez complexe de changer de police directement dans R.

Il existe maintenant une librairie dans Latex qui permet de faire des graphiques de très grande qualité : Tikz. Ces graphiques ont un rendu, à mes yeux, plus précis et plus agréable à l’oeil. De plus, Tikz travaille avec la police de caractère du document et permet d’harmoniser l’ensemble du document. Mais il faut mettre les mains dans le moteur de manière chronophage.

Comment faire pour concilier les deux ? Et bien il existe une solution (toujours en version bêta mais qui fonctionne très bien) grâce à une libraire pour R : TikzDevice qui permet de créer un graphique dans R et de le récupérer dans son document très simplement, au format généré par Tikz.

Voici un exemple, à partir de comparaisons statistiques entre différents catégories socioprofessionnelles et groupes sociaux, en 1936, dans le département du Finistère.

Après avoir saisi les données dans un fichier, je les ai traité avec un script R « classique ». Il faut ici charger une librairie (ggplot2), récupérer les données et ensuite construire le graphique, en ayant indiqué, en début de script le format et les dimensions du document généré, à savoir un fichier PDF.

library(ggplot2)
pdf("ouvragri.pdf",, width = 6, height = 3)
donnees <- read.csv(donneesouvragri.csv)
levels(donnees$Categorie)
attach(donnees)
donnees$Categorie <- factor(donnees$Categorie, levels = c("A", "B", "C", "D", "E", "F", "G", "H", "I"))
donnees.m <- melt(donnees)
ggplot(donnees.m, aes(Categorie, value, fill=Categorie)) +
     geom_histogram() +
     facet_wrap(~ variable, scales="free_y", ncol = 3) +
     xlab("") + ylab("") +
    opts(axis.text.x=theme_text(angle=60, hjust=1, col = "blue", size=8),
        axis.text.y=theme_text(hjust=1, col = "blue",, size=8),
        legend.position = "none")
dev.off()

Pour incorporer le PDF dans le fichier Latex, il suffit , de manière classique, de faire quelque chose comme :

\begin{figure}[!h]
        \centering
        {\includegraphics[width=1\textwidth]{img/OuvrAgriRecensement.pdf}}
        {\caption{Répartitions par industries ou professions en 1936.\newline\scriptsize{A : Pêche, B : Agriculture, C : Industries extractives, D : Industries de transformation, E : Manutention et transports, F : Commerce, banque, G : Professions libérales, H : Soins personnels, domestiques, I : Services publics. Source : Statistique générale de France, 1936}.}
        \label{recen}}
\end{figure}

Et le graphique s’insère à la dimension souhaitée :

PNG - 115.1 ko

Cliquez sur l’image pour l’agrandir

Maintenant, utilisons l’autre technique avec TikzDevice. Même si le mécanisme est relativement simple à comprendre, j’ai mis un temps certain à trouver comment enchaîner les opérations. C’est pourtant d’une simplicité enfantine.

Il est cependant nécessaire de modifier à la marge son script R.

library(ggplot2)
library(tikzDevice) % première modification
options(tikzDefaultEngine = 'xetex') % deuxième modification
donnees <- read.csv(donneesouvragri.csv)
levels(donnees$Categorie)
attach(donnees)
donnees$Categorie <- factor(donnees$Categorie, levels = c("A", "B", "C", "D", "E", "F", "G", "H", "I"))
donnees.m <- melt(donnees)
donnees.m <- melt(donnees)
tikz(file = "OuvrAgriRecensement.tex", width = 6, height = 2.5) % troisième modification
ggplot(donnees.m, aes(Categorie, value, fill=Categorie)) +
     geom_histogram() +
     facet_wrap(~ variable, scales="free_y", ncol = 3) +
     xlab("") + ylab("") +
    opts(axis.text.x=theme_text(angle=60, hjust=1, col = "blue", size=8),
         axis.text.y=theme_text(hjust=1, col = "blue",, size=8),
         legend.position = "none")
 dev.off()

Nous avons chargé une deuxième librairie, TikzDevice et mis une option pour lui indiquer que nous travaillons avec XeteX. Dernière modification juste avant de construire le graphique : la commande tikz(......). Sont indiqués, le nom du fichier en sortie (c’est ce nom que nous mettrons dans le document maître) et la taille du graphique. Bien sur, il faut supprimer la ligne qui demande une sortie en format PDF.

Le script met plus longtemps à faire son travail que d’habitude. il crée un fichier .tex intermédiaire, fichier qui contient la traduction du graphique en commandes Tikz. Et le fichier est inséré avec les commandes suivantes, en lieu et place du graphique :

\begin{figure}[!h]
        \centering
        \input{OuvrAgriRecensement.tex}
        \caption{Répartitions par industries ou professions en 1936.\newline\scriptsize{A : Pêche, B : Agriculture, C : Industries extractives, D : Industries de transformation, E : Manutention et transports, F : Commerce, banque, G : Professions libérales, H : Soins personnels, domestiques, I : Services publics. Source : Statistique générale de France, 1936}.}
        \label{recen}}
\end{figure}

Et voici le résultat final :

PNG - 114.2 ko

Cliquez sur l’image pour l’agrandir
Pour résumer :
- adapter son script R avec la librairie TikzDevice ;
- lancer le script avec un logiciel ad hoc (par exemple le super Rstudio) ;
- compiler son document maître après avoir intégré le fichier tex produit par le script R.

Quelques paramètres à changer donc mais le résultat compense largement le petit travail supplémentaire. De plus, il suffit de changer la police en entête du document maître pour qu’elle change également dans les graphiques sans qu’il soit nécessaire de tout recompiler. CooL.

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message