Suite à une mésaventure liée à matplotlib sur le chan IRC #bioinfo-fr (mésaventure suite aux fameuses erreurs de display ; si vous voulez tout savoir : si on configure mal son matplotlib on peut générer des erreurs qui font qu'on obtient des images vides… voir la partie sur le backend plus tard :o), j'ai parlé de la joie qu'est d'avoir un matplotlibrc et à quel point ça simplifie la vie.
Et comme ça pourrait servir à d'autres, voici un petit article pour parler de fichiers de configuration de matplotlib !
Qu'est-ce qu'un matplotlibrc ?
Il s'agit tout simplement d'un fichier de configuration pour matplotlib (comme votre bashrc ), qui permet d'éviter de faire joujou avec les paramètres dynamiquement, de les garder au chaud d'un import à l'autre 😉
Vous avouerez que pour les histoires de backend (la source depuis laquelle vous faites appel à matplotlib, plus de détails ici) sur les serveurs sans serveur X (AKA sans interface graphique), et pour avoir un style cohérent d'une figure à l'autre (de sa thèse par exemple) c'est plutôt pratique !
Où est-ce que je range mon matplotlibrc ?
Alors c'est très simple, matplotlib va aller chercher un matplotlibrc à 4 endroits différents au moment de son chargement, et ce dans cet ordre :
- dans le fichier matplotlibrc dans le dossier courant
- dans $MATPLOTLIB/matplotlibrc
- dans .config/matplotlib/matplotlibrc (ou dans .matplotlib/matplotlibrc si vous n'êtes pas sous GNU/Linux)
- dans /etc/matplotlibrc si vous êtes sous GNU/Linux. Attention, ce fichier sera écrasé à chaque fois que vous ré-installerez matplotlib ! Ce n'est donc pas un endroit pérenne pour aller tripatouiller votre configuration de matplotlib.
Comment est-ce que je vois quel fichier de configuration est chargé ?
Il suffit d'exécuter dans votre shell python (ou encore mieux dans iPython3 !) les commandes suivantes :
1 2 |
import matplotlib matplotlib.matplotlib_fname() |
Qu'est-ce que je mets dans mon matplotlibrc ?
Pour faire court (oui oui, il m'arrive de faire court ^_^) : toute la configuration de matplotlib que vous souhaitez conserver d'une fois à l'autre.
Je pense notamment au backend que vous utilisez, que ça soit chez vous, sur votre PC portable ou sur le serveur de calcul sans serveur X.
Pour cela, insérez tout simplement :
1 2 3 4 5 6 7 |
# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo # MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG # Template. # You can also deploy your own backend outside of matplotlib by # referring to the module name (which must be in the PYTHONPATH) as # 'module://my_backend'. backend : Agg |
Et pour que le backend ait une solution de repli alternatif automatique en cas de conflit :
1 2 3 4 |
# if you are running pyplot inside a GUI and your backend choice # conflicts, we will automatically try to find a compatible one for # you if backend_fallback is True backend_fallback: True |
Quelques options cools :
1 2 3 |
interactive : False toolbar : toolbar2 # None | toolbar2 ("classic" is deprecated) timezone : Europe # a pytz timezone string, e.g., US/Central or Europe/Paris |
Et là où la magie s'opère…
Oui parce que c'est bien beau toute cette tambouille interne, mais je vous ai promis des figures cohérentes tout au long de votre thèse ! :p
En fait, vous pouvez tout définir dans votre matplotlibrc : de l'aspect des lignes à l'aspect des boxplots, en passant par la fonte et à l'utilisation de LaTeX.
Plutôt que de vous faire une liste longue comme le bras de ce que vous pouvez faire comme customisation, je vous propose d'aller jeter un œil à ce dépôt git ! Vous y trouverez des démos pour plusieurs styles de matplotlibrc : du R-like, du ggplot-like… et comme nous naviguons dans le merveilleux monde des fichiers de configuration, sachez qu'il en existe plein d'autres (certains sont même sourcés dans le dépôt git que j'ai cité).
Et voilà, à votre éditeur de texte préféré et faites-vous un matplotlibrc 😉
Je remercie m4rsu pour l'idée de cette article, mes chères relectrices Clem_, Gwenaëlle, Estelle, et mon admin adoré Yoann M.
Hub
novembre 30, 2017 à 11:27
Petite précision utile : en utilisant 'Agg', un 'pyplot.show()' ne marchera plus car 'Agg' est un backend non-interactif, il ne peut que générer des fichiers.
Effet de bord à savoir surtout que matplotlib n'envoie aucun message d'erreur 😉