Tutoriel Matplotlib


Tutoriel Matplotlib

Daidalos 30 mai 2014


Introduction à Matplotlib

Bibliothèque pour tracer et visualiser avec python

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.
>>>

Fenêtre qui apparait automatiquement suite à "matplotlib.pyplot.show()"

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()

Fichier "exemple_matplotlib.png" obtenu avec la commande plt.savefig('exemple_matplotlib.png')

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

Figure correspondante à l'exemple ci-contre.

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

Image 1: matrice de départ.

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:

Image 2: matrice transposée.

>>> 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()

Image 3: matrice avec origin='lower'.

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

Licence


Info


Visiteurs en ligne: Vues: 6638 Actif: 30 mai 2014 04:02 Commentaires: 0