Introduction à Matplotlib
Matplotlib est une bibliothèque du langage de programmation python qui, combinée avec les bibliothèques python de calcul scientifique numpy et scipy, constitue un puissant outil pour tracer
et visualiser des données.
La bibliothèque matplotlib présente de nombreux avantages:
- disponible gratuitement
- open source
- facilité d'apprentissage
- extensible
- marche sur plusieurs système d'exploitations: Unix, Mac Os, Windows, etc
- une communauté d'utilisateurs de plus en plus importante
- etc
Installation de Matplotlib
Matplotlib est une bibliothèque et nécessite d'installer au préalable: python, numpy, libpng et freetype, sur votre système (voir la liste Build requirements sur la page officielle d'installation de matplotlib). Si vous connaissez bien votre système d'exploitation, vous pouvez choisir d'installer manuellement ces derniers. Si, au contraire, vous voulez rapidement pouvoir utiliser matplotlib sans passer par une installation manuelle qui peut parfois s'avérer difficile, il est recommandé d'installer le package de la compagnie Enthought.
Installation manuelle
Avant d'installer matplotlib, vérifier tout d'abord sur la page officielle les versions de python, numpy, libpng et freetype requises. Télécharger ensuite python correspondant à votre système d'exploitation et installer celui-ci. Une fois python installé, une bonne "python" pratique est d'installer les packages setuptools ou plus récemment pip (remplaçant de easy_install). Ces packages ont été développés dans le but de facilité l'installation des bibliothèques de python. Pour installer les bibliothèques python
numpy par exemple, il suffit alors de taper la commande suivante:
pip install numpy
Et pour terminer, réitérer cette opération avec matplotlib.
Remarque: la principale difficulté, lorsqu'on installe plusieurs bibliothèques python, est d'avoir un ensemble de bibliothèque compatible les unes avec les autres (telle bibliothèque peut dépendre de telle ou telle version). Durant une mise-à-jour d'une bibliothèque il est alors possible que plus rien ne fonctionne. Une solution est alors d'utiliser le package virtualenv que vous pouvez installer en tapant la commande suivante:
pip install virtualenv
Virtualenv est un outil python pour créer des environnements isolés sur votre système.
Remarque: il existe de nombreux problèmes pouvant apparaitre lors de l'installation de matplotlib et de ses dépendances. Cependant, l'objectif de cet article est d'introduire rapidement matplotlib et pas de parcourir tous les problèmes possibles pouvant survenir lors de son installation (si vous voulez partager les difficultés rencontrées lors de votre installation de matplotlib, n'hésitez pas a créer un article).
Installation par Enthought
Certainement la méthode d'installation la plus facile et la plus rapide. La compagnie Enthought (Scientific Computing Solutions) propose, en effet, un package gratuit pour installer en quelques secondes python et un ensemble de librairies très utiles comprenant entre-autres:
- matplotlib (pour tracer et visualiser)
- scipy (pour le calcul scientifique: intégration numérique, interpolation bilinéaire, etc)
- et numpy (pour les opérations sur les matrices: multiplication, inversion, etc).
Avec ce package, les possibilités offertes sont déjà très nombreuses et il est possible d'appliquer la plupart des exemples présents sur le site officiel de matplotlib. Cependant il se peut, par la suite, que vous ayez besoin d'une librairie python, bien spécifique, qui n'est pas incluse dans le package gratuit (par exemple basemap pour tracer des cartes). Dans ce cas, soit vous essayez d'installer manuellement cette librairie, soit vous vous procurez le package payant de Enthought en vérifiant au préalable la liste des librairies incluses dans le package.
Démarrer avec Matplotlib
Sur le site de matplotlib, il existe de nombreux exemples permettant de bien démarrer avec celle-ci (cliquez sur une image pour obtenir le code source correspondant). Ci-dessous, nous allons voir quelques points essentiels pour comprendre et apprendre à utiliser rapidement matplotlib:
Tracer une simple fonction
Pour tracer une figure avec matplotlib il existe plusieurs solutions. Dans ce premier exemple, nous allons voir comment tracer une simple courbe en passant directement par l'interpréteur de commande de python.
Etape 1: lancez tout d'abord l'invite de commande de votre machine (par l'intermédiaire par exemple de cmd sous windows ou du terminal sous mac).
Remarque: Vous pouvez également accéder directement a l'invite de commande de python par l'intermédiaire de l'application "idle.app"
Etape 2: lancez l'interpréteur de commande python en tapant tout simplement python dans l'invite de commande de votre machine (étape 1).
Vous devez alors obtenir quelque chose ressemblant à ceci:
[machine nom] toto% python
Enthought Python Distribution -- www.enthought.com
Version: 7.2-1 (32-bit)
Python 2.7.2 |EPD 7.2-1 (32-bit)| (default, Sep 7 2011, 09:16:50)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "packages", "demo" or "enthought" for more information.
>>>
Remarque: Le signe >>> est l'invite de commande de python.
Etape 3: Tracez vos données.
Considérons l'exemple de la fonction $y=sin(2\pi x)$ entre $x=-5$ et $x=5$. Pour tracer cette fonction il va alors falloir entrer une suite de commande, comme par exemple:
>>> import numpy
>>> import matplotlib.pyplot
>>> x = numpy.arange(-5,5, .01)
>>> y = numpy.sin(2*numpy.pi*x)
>>> matplotlib.pyplot.plot(x,y)
>>> matplotlib.pyplot.show()
Remarque: quelques courtes explications sur ces commandes. La commande "import numpy" permet d'importer numpy afin de pouvoir travailler avec des tableaux (la commande "numpy.arange(-5,5, .01)" permet par exemple de créer un tableau de données allant de -5 a 5 avec une résolution de .01). La commande "import matplotlib.pyplot" permet quand à elle d'importer une fonction pyplot de matplotlib qui va alors nous permettre de tracer nos résultats. Les autres lignes de commandes du code devraient être facilement compréhensible.
Remarque: vous pouvez constater que certaines informations dans les commandes précédentes sont redondantes (par exemple le terme "matplotlib.pyplot" apparait plusieurs fois). Il est cependant possible de corriger cela avec python en tapant "import matplotlib.pyplot as plt" afin de remplacer par exemple le terme "matplotlib.pyplot" par "plt". Le code ci-dessous va donc produire le même résultat que précédemment:
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.arange(-5,5, .01)
>>> y = np.sin(2*np.pi*x)
>>> plt.plot(x,y)
>>> plt.show()
Etape 4: Sauvegardez votre figure. Pour cela, il suffit de rajouter dans notre exemple les deux lignes suivantes "plt.figure()" et "plt.savefig('nomdelafigure.png')", comme ceci:
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.figure()
>>> x = np.arange(-5,5, .01)
>>> y = np.sin(2*np.pi*x)
>>> plt.plot(x,y)
>>> plt.savefig('exemple_matplotlib.png')
Le fichier "exemple_matplotlib.png" doit alors apparaître dans votre répertoire courant.
Etape 5: quittez python en tapant la commande suivante: quit()
Tracer les données d'un fichier
Dans ce second exemple sur matplotlib, nous allons voir comment tracer des données qui sont stockées dans un fichier. Cette situation est relativement courante (par exemple dans le cadre d'une expérience, d'un fichier de sortie d'un programme, etc) et c'est pourquoi nous avons choisi de la présenter ici.
Considérons le cas simple ou on dispose d'un fichier (intitulé "fichier_resultat") avec deux colonnes x et y:
0.0 0.0
0.5 0.3
1.0 1.2
1.5 1.7
2.0 1.9
2.5 2.6
3.0 3.2
3.5 3.4
4.0 4.2
La question est: comment lire et ensuite tracer avec matplotlib ces données!. Tout d'abord rappelons que matplotlib est une bibliothèque python de visualisation et de tracer, elle n'a donc pas pour rôle de lire et de travailler avec des données !. Ce n'est donc pas avec matplotlib que vous trouverez la solution à ce problème. Généralement quand on lit des données on les stocks dans un tableau et qui dit tableau avec python dit numpy !. En effet numpy possède la fonction loadtxt qui permet de lire les données d'un fichier et de les stocker dans un tableau. Voici donc un exemple permettant de tracer les données du fichier avec matplotlib:
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>>
>>> x,y = np.loadtxt("fichier_resultat", unpack=True)
>>> plt.plot(x,y,'o')
>>>
>>> plt.xlabel('x')
>>> plt.ylabel('y')
>>> plt.title("Tracer les donnees d'un fichier avec maptplotlib")
>>>
>>> plt.show()
Remarque: L'option "unpack=True" permet de spécifier à loadtxt de mettre les données dans deux tableaux distincts qui sont ici x et y. Sur cette page vous trouverez plus d'informations sur loadtxt.
Remarque: dans cet exemple on lance python dans le même répertoire que le fichier intitulé "fichier_resultat". Si vous n'avez pas lancé python dans le même répertoire que le fichier, veuillez indiquer le chemin complet vers celui-ci (par exemple: "/Users/toto/matplotlib/test/fichier_resultat").
Tracer une image
Matplotlib permet également de tracer facilement des images.
On va, ici, voir un cas pratique et aborder un point qui peut paraître un peu déroutant quand on commence à vouloir tracer des images avec matplotlib. Rappelons tout d'abord qu'une image est constituée d'un ensemble de pixels (généralement carrés et de même taille) et peut être vue comme un ensemble $\{(x,y,z) \}$ où $(x,y)$ est la position du pixel et $z$ contient une information sur sa couleur. Pour Matplotlib une image peut donc généralement ce résumer à une matrice $(z_{i,j})$ où $(i,j)$ est l'indice correspondant à la ligne et à la colonne.
Cependant, il faut être prudent avec les matrices car vous n'allez pas forcement obtenir ce que vous recherchez à tracer au départ !. Pour illustrer le problème, considérons le cas ou vous avez un ensemble de données rangées comme ceci:
\begin{array}{cccc}
& y1 & y2 & y3 & ...\\
x1 & 25. & 92. & 15. & 10.\\
x2 & 5. & 2. & 91. & 15. \\
x3 & 80. & 35. & 5. & 5. \\
x4 & 10. & 4. & 10. & 97. \\
x5 & 2. & 93. & 3. & 5. \\
\end{array}
où $x$ et $y$ correspondent à l'axe des abscisses et des ordonnées. Vous pouvez alors mettre vos données dans une matrice et les tracer grâce à la commande imshow (qui est une commande matplotlib pour tracer des images), comme ceci:
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import matplotlib.cm as cm
>>> Data = np.matrix([[ 25., 92., 15., 10.],
[ 5., 2., 91., 15.],
[ 80., 35., 5., 5.],
[ 10., 4., 10., 97.],
[ 2., 93., 3., 5.]])
>>> plt.imshow(Data, cmap=cm.jet, interpolation='nearest')
>>> plt.show()
Ces quelques lignes de code doivent produire quelque chose ressemblant à l'image 1. Vous pouvez alors constater que l'image tracée correspond directement à la matrice "Data" qu'on a fournit à la commande imshow. Cependant, par rapport à nos données ce n'est pas ce que l'on veut. En effet, l'axe des abscisses et des ordonnées sont inversés, de plus l'origine commence en haut à gauche.
Pour tracer une image correspondante à nos données il est donc nécessaire de modifier un peu le code ci-dessus. Tout d'abord, if faut transposer la matrice data par l'intermediaire de la commande "Data.T", comme ceci:
>>> plt.imshow(Data.T, cmap=cm.jet, interpolation='nearest')
Avec cette modification, vous devez obtenir quelque chose ressemblant à l'image 2. Vous pouvez voir que maintenant l'axe des des abscisses et des ordonnées sont correctement placés. Cependant l'origine est encore en haut à gauche. Pour rectifier cela, il suffit d'ajouter "origin='lower'" dans la commande précédente:
>>> plt.imshow(Data.T, cmap=cm.jet, interpolation='nearest', origin='lower')
et vous obtiendrez finalement l'image recherchées.
Vous savez désormais comment tracer une image avec matplotlib et qu'il est important de raisonner en terme de matrice et non pas en terme d'abscisses et d'ordonnées $(x,y)$ ce qui peut conduire à des erreurs d'interprétation.
Tutoriels pour apprendre Matplotlib
Pour continuer à découvrir les différentes fonctionnalités de matplotlib à travers des tutoriels (voir aussi le Forum de discussion sur le tutoriel Matplotlib):
Titre | Principaux Points abordés |
---|---|
Représentations graphiques simples avec matplotlib | TBD |
Travailler avec des histogrammes | Histogrammes 2d |
Ajuster les bords d'une figure | TBD |
Modifier les couleurs de fonds d'une figure | TBD |
Modifier les axes d'une figure | TBD |
Les coordonnées polaires avec Matplotlib | TBD |
Matplotlib et wxPython | TBD |
Les dendrogrammes avec Matplotlib | TBD |
Les mathématiques avec LaTeX et Matplotlib | TBD |
Apprendre Matplotlib par l'exemple
Si vous préférez plutôt découvrir les différentes fonctionnalités de matplotlib à travers des exemples concrets c'est par ici: Galerie d'exemples Matplotlib
Titre | Principaux points abordés |
---|---|
Tracer une figure de diffraction | Comment lire un fichier ascii ? |
Comment tracer une image avec imshow ? | |
Comment changer l'échelle de couleur ? | |
Créer une image RGB depuis des mesures satellitaires | Comment lire un fichier HDF ? |
Comment tracer une image avec imshow ? | |
A quoi sert la fonction scipy: bytescale ? |
Supporter Matplotlib
Liens |
------------- | -------------
Comment citer matplotlib dans mes articles ?
Comment faire une donation ?
Comment contribuer au développement de matplotlib ?
Recherches associées
Liens | Site |
---|---|
matplotlib | page officielle sur laquelle vous trouverez de la doc et de nombreux exemples. |
scipy | page de scipy (calcul scientifique avec python) |
numpy | page de numpy (bibliothèque python dédiée au calcul matriciel) |
enthought | package pour installer python et quelques bibliothèques |