TD H1 - Apercu de la bibliothèque python matplotlib¶

Pour effectuer des tracés de courbes, il existe un module très riche, le module matplotlib et sons sous module pyplot, qui propose une multitude de fonctionnalités. Le site internet dédié à ce module https://matplotlib.org vous montrera entre autre la galerie impressionnante de tracés possibles (cliquer sur l’onglet « Examples » sur la page d’accueil du site), ainsi que toute la documentation (onglet «Documentation»).

Remarque pratique : lorsque l'on crée/modifie des graphiques avec matplotlib dans l'environnement capytale, ils se superposent sur la même figure. Afin de rendre les choses plus claires on pensera à utiliser les commandes :

  • plt.figure(...num...) avec un numéro différent pour chaque figure différente
  • plt.clf() pour effacer la figure avant de la redessiner

I. Quelques exemples en guise de documentation¶

1. Un premier tracé, tout automatique¶

Pour nos tracés, c'est en réalité le sous-module pyplot qui nous sera utile. Le principe général est simple: pour tracer la courbe reliant l'ensemble des points de coordonnées $(x_i,y_i)$, on fournira à python séparément la liste des abscisses et la liste des ordonnées (qui doivent donc avoir la même taille !). Voici sur un exemple classique montrant comment tracer la représentation graphique de la fonction sinus (à noter : la première exécution prend un peu de temps, car il faut charger la bibliothème matplotlib...):

In [ ]:
import matplotlib.pyplot as plt
import math

nb_points = 100 # nombre de points du tracé
x = [2*math.pi*t/nb_points for t in range(nb_points)] # liste des abscisses
y = [math.sin(t) for t in x] # liste des ordonnées

plt.figure(1) # Figure No 1
plt.clf() # pour effacer la figure précédente à chaque fois que l'on exécute la cellule
plt.plot(x,y) # crée le dessin (en mémoire)
plt.show() # affichage du dessin
# plt.savefig("mon_dessin.png") # si l'on veut sauver l'image sur disque

Quelques commentaires :

  • on importe le sous-module pyplot de matplotlib avec l'alias plt (ce choix de l'alias est usuel)

  • on importe le module math pour avoir la constante pi et la fonction sinus

  • On crée la liste des abscisses et celle des ordonnées par compréhension

  • On crée le dessin (mais uniquement "en mémoire")

  • On affiche le dessin (tout est géré par matplolib)

  • Si on le souhaite, on sauvegarde la figure sur le disque en donnant son nom (et son extension).

Remarque 1: en pratique, le module matplotlib est très souvent utilisé conjointement avec le module numpy qui facilite entre autres choses la création des listes. Pour ne pas surcharger les nouveautés, nous n'en feront pas usage ici...

Remarque 2: Les possibilités de paramétrage offertes par ce module sont énormes. Nous n'en verrons qu'un mini échantillon.

2. Titre et personnalisation des axes¶

In [ ]:
import matplotlib.pyplot as plt
import math

nb_points = 100 # nombre de points du tracé
x = [2*math.pi*t/nb_points for t in range(nb_points)] # liste des abscisses
y = [math.sin(t) for t in x] # liste des ordonnées

plt.figure(2) # Figure No 2
plt.clf() # pour effacer la figure précédente à chaque fois que l'on exécute la cellule

# modifications d'apparence :
plt.title('Fonction sinus')
plt.xlabel('le temps en secondes')
plt.xlim(0,10)
plt.ylabel('les images...',color = 'b')

plt.plot(x,y) # crée le dessin (en mémoire)
plt.show() # affichage du dessin

3. Superposition de plusieurs courbes¶

On peut superposer plusieurs courbes sur me même dessin. Par exemple, si on souhiate comparer la fonction sinus et la fonction cosinus sur le même dessin on ajoute tout simplement une fonction plot. Voici un code possible avec une légende:

In [ ]:
import matplotlib.pyplot as plt
import math

nb_points = 100 # nombre de points du tracé
x = [2*math.pi*t/nb_points for t in range(nb_points)] # liste des abscisses
y1 = [math.sin(t) for t in x] # liste des ordonnées
y2 = [math.cos(t) for t in x] # liste des ordonnées

plt.figure(3)
plt.clf()
plt.plot(x,y1, label='sinus') 
plt.plot(x,y2, label='cosinus')
plt.legend() # affiche la légende
plt.show() 

4. Graphiques côte à côte ¶

Pour dissocier 2 graphiques (les deux côte à cote), on va utiliser la fonction plt.subplot(abc) où a représente le nombre de lignes souhaitées, b le nombre de colonnes et c le numéro du graphique. Un exemple valant mieux qu'un long discours :

In [ ]:
import matplotlib.pyplot as plt
import math

nb_points = 100 # nombre de points du tracé
x = [2*math.pi*t/nb_points for t in range(nb_points)] # liste des abscisses
y1 = [math.sin(t) for t in x] # liste des ordonnées
y2 = [math.cos(t) for t in x] # liste des ordonnées

plt.figure(4)
plt.clf()
plt.subplot(121)
plt.plot(x,y1, label='sinus') 
plt.legend()
plt.subplot(122)
plt.plot(x,y2, label='cosinus')
plt.legend()
plt.show()

5. Quelques « décorations »¶

Voici encore quelques fonctionnalités supplémentaires à tester. Il est possible d’ajouter sur la courbe tracée, des motifs, tels que des croix, points, etc...

Pour connaître toutes les options, le mieux est de se référer à la documentation officielle de matplotlib ou sur des sites comme W3 school. Voyons ici quelques-unes d’entre elles (à saisir à l'intérieur de la fonction plot) :

  • bornes : spécifier un rectangle de représentation, ce qui permet un zoom, permettant de restreindre la tracé sur une zone donnée, cela se fait via la commande plt.axis([xmin,xmax,ymin,ymax])

  • couleur du trait : pour changer la couleur du tracé une lettre g vert (green), r rouge (red), k noir, b bleu, c cyan, m magenta, y jaune (yellow), w blanc (white). Par exemple, plt.plot(...,'r') tracera une courbe en rouge. Pour avoir encore plus de couleurs, on pourra utiliser le mot clé color=[R,G,B] où les 3 paramètres R (Red), G (Green) et B (Blue) sont des nombres compris entre 0 et 1, pour indiquer leur niveau.

  • symboles : mettre des symboles aux points tracés se fait via l’option marker. Les possibilités sont nombreuses parmi '+', '*', ',' , '.', et bien d'autres...

  • style du trait : pointillés, absences de trait, etc se décident avec linestyle. Au choix '-' pour ligne continue, '--' pour tirets, ':' pour pointillés, etc.

  • épaisseur du trait : linewidth= flottant (comme par exemple : linewidth=2).

  • taille des symboles (markers) : markersize = flottant comme pour l’épaisseur du trait. D’autres paramètres sont modifiables, comme markeredgecolor pour la couleur du trait du pourtour du marker, markerfacecolor pour la couleur de l’intérieur (si le marker possède un intérieur comme 'o'), markeredgsize= flottant pour l’épaisseur du trait du pourtour du marker. On pourra remarquer que si la couleur n’est pas spécifiée pour chaque nouvel appel la couleur des markers change de façon cyclique.

  • étiquettes sur les axes des abcisses et ordonnées : Matplotlib décide tout seul des graduations sur les axes. Tout ceci se modifie via : plt.xticks(tf), plt.yticks(tf) où tf est une liste de flottants ordonnés de façon croissante.

Voyons un exemple :

In [ ]:
import matplotlib.pyplot as plt
import math

nb_points = 10 # nombre de points du tracé
x = [2*math.pi*t/nb_points for t in range(nb_points)] # liste des abscisses
y = [math.sin(t) for t in x] # liste des ordonnées

plt.figure(4)
plt.clf()

plt.plot(x,y,
    marker = 'x',
    linestyle=':',
    color='g',
    markersize='10',
    markerfacecolor='b',
    markeredgecolor='b' ,
    label='sinus',
    )
plt.title('Fonction sinus')
plt.xlabel('temps en minutes', color = 'b')
plt.ylabel('position du pendule')
plt.xticks([0,2,4,6,8])
plt.legend()
plt.show()

II. Un exercice pour voir si on a compris¶

Proposer un script permettant de tracer la courbe suivante (fonction racine carrée), en respectant légendes, titres couleurs, aspect.

racine_matplotlib.png

In [ ]:
 
In [ ]: