Figures

Nous utiliserons le module matplotlib.pyplot pour tracer des figures avec Python.

Pour afficher les figures ici dans le notebook, il faut également utiliser l'instruction %matplotlib nbagg quand on importe les différents modules (sinon les figures s'affichent dans une fenêtre à part). (Quand vous utiliserez IDLE vous n'aurez pas besoin de l'instruction %matplotlib nbagg.)

In [1]:
%matplotlib nbagg

import matplotlib
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Chaque fonction de pyplot apporte un changement à la figure courante comme p.ex. tracer des lignes, changer la couleur, ajouter une légende, annoter les axes etc.

Voici un premier exemple pour tracer une courbe:

  • La fonction plt.figure crée une nouvelle figure (dont le numéro de figure est le nombre passer à la fonction en argument).

  • Ensuite, la fonction plt.plot crée une courbe qui passe par les points dont les coordonnées sont données en argument par deux listes. La première liste sont les coordonnées des abscisses, la deuxièmes les coordonnées des ordonnées.

In [2]:
plt.figure(1)
plt.plot(range(5),[4,3.6,2.5,3.2,4.1])
Out[2]:
[<matplotlib.lines.Line2D at 0x5aeaad0>]

Ici, dans le notebook, nous sommes en mode interactif, ce qui veut dire qu'il est possible d'ajouter des éléments supplémentaires ou de modifier les caractéristiques de la figure.

Essayez d'ajouter une autre courbe à la figure par une nouvelle instruction plt.plot. La courbe doit passera par les points (2, 3), (0.5, 3.5) et (8, 2).

In [ ]:
 

Pour effacer une figure et recommencer, il faut arrêter le mode interactif en appuyant sur le bouton bleu en haut à droite de la figure.

Que se passe-t-il si on appelle la fonction plt.plot avec une seule liste ? Essayez-le.

In [3]:
plt.plot([3,4,3,4,3,4,3,4,3,4,3])
Out[3]:
[<matplotlib.lines.Line2D at 0x5da45d0>]

Les fonctions de matplotlib ne sont pas limitées à des listes comme arguments des fonctions, mais elles acceptent aussi des numpy array.

Il est également possible de tracer plusieurs courbes par un seul appel de la fonction plt.plot:

In [4]:
plt.figure(2)
x = np.arange(0., 10., 0.1)
y1 = 2*x
y2 = np.sqrt(x)+6*np.log(x+1)
y3 = x**2-10*x
plt.plot(x,y1, x,y2, x,y3)
Out[4]:
[<matplotlib.lines.Line2D at 0x5defd10>,
 <matplotlib.lines.Line2D at 0x5dcaaf0>,
 <matplotlib.lines.Line2D at 0x5dca330>]

Titre et noms des axes

Maintenant, ajoutons un titre à la figure et annotons les axes :

In [5]:
plt.title('Titre')
plt.ylabel("Axe des ordonnees")
plt.xlabel("Axe des abscisses")
Out[5]:
<matplotlib.text.Text at 0x5db4e10>

Rappelez-vous qu'en Python, il faut faire attention avec les chaînes de caractères dans le sens qu'il ne faut pas utiliser des lettres avec des accents (donc pas de à,é,è etc.), sinon il y a erreur.

Aussi, pour définir une chaîne de caractères contenant des apostrophes comme la phrase Python, c'est trop cool, il faut utiliser les guillemets (") et non pas les apostrophes ('). C'est-à-dire, on écrit "Python, c'est trop cool", parce que 'Python, c'est trop cool' ne marchera pas.

Changez le titre et les noms des axes de la dernière figure.

Couleur, type de ligne, marqueur

Maintenant, nous allons apprendre à modifier la couleur, tracer des points, choisir les symboles représentant des points etc. Cela peut se faire par les options de la fonction plt.plot.

Analysez les exemples suivants.

In [6]:
plt.figure(3)
x = np.arange(0., 5., 0.1)
y = x**2
plt.plot(x,y)
plt.plot(x,y+1, linewidth=5.0, color='r', linestyle='--')
plt.plot(x,y+2, 'r--')
plt.plot(x,y+3, 'g:')
plt.plot(x,y+4, 'b-.')
plt.plot(x,y+5, 'c^')
Out[6]:
[<matplotlib.lines.Line2D at 0x5e833b0>]

Alternativement, on peut utiliser les attributs du graphique pour modifier ses caractéristiques. Ceci est particulièrement pratique quand on veut tracer plusieurs courbes dans le même style. (Consultez l'aide sur matplotlib.lines.Line2D pour une description complète des attributs http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D.)

Voyons comment ça marche en continuant l'exemple ci-dessus :

In [7]:
courbes = plt.plot(x,y+6, x,y+7, x,y+8)
plt.setp(courbes, color='m', linestyle='-.')
Out[7]:
[None, None, None, None, None, None]
In [8]:
courbes2 = plt.plot(x,30-y, x,y-3)
plt.setp(courbes2,color='k', marker = '.',markevery=5, markersize=50,markeredgecolor='g',
         markerfacecolor='w')
Out[8]:
[None, None, None, None, None, None, None, None, None, None, None, None]

Liste de couleurs en matplotlib:

Liste de types de ligne (linestyle):

  • '-' ligne solide

  • '--' ligne interrompue

  • ':' ligne pointillée

  • '-.' ligne en traits-points

  • ' ' rien, pas de ligne

Liste de types de marker (markerstyle):

Plusieurs figures dans une fenêtre

Voyons maintenant comment créer plusieurs figures dans une seule fenêtre. Voici un exemple, dont le code est expliqué après :

In [9]:
def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

plt.figure(4)
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')

plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
Out[9]:
[<matplotlib.lines.Line2D at 0x650b390>]

Pour tracer plusieurs figures dans une même fenêtre, on ouvre d'abord une fenêtre par la fonction plt.figure.

Ensuite, on crée la première figure par la fonction plt.subplot, et on trace tous les graphiques de la première figure par des commandes plt.plot.

Pour passer à la figures suivante, on appelle encore la fonction plt.subplot, puis on trace les graphiques correspondants avec plt.plot.

L'unique difficulté pour des figures multiples sont les arguments de la fonction plt.subplot(lcn). Les nombres l et c indiquent le nombre de figures et comment les-répartir dans la fenêtre. En fait, virtuellement la fenêtre est coupée en l lignes et c colonnes définissant les emplacements des différentes figures. Ensuite, n est le numéro de la figure actuelle qu'on veut construire (les figures sont numérotées de gauche à droite, du haut en bas). Dans l'exemple ci-dessus on trace deux figures l'un au-dessous de l'autre. On a alors l=2 lignes et c=1 colonne.

Dans l'appel de plt.subplot, on peut aussi mettre des virgules entre les arguments. C'est-à-dire les instructions plt.subplot(3,2,5) et plt.subplot(325) sont équivalentes. En revanche, si un des nombres l,c,n dépasse 9, les virgules deviennent obligatoires.

Légende

Dès qu'on trace plus d'une courbe dans une figure, il est très important de mettre une légende pour expliquer les différentes couleurs/symboles. Voici comment faire: D'abord on trace ses différentes courbes avec plt.plot en ajoutant l'option label='texte pour la legende'. Ensuite, on utilise plt.legend pour construire une légende.

In [10]:
plt.figure(5)
plt.plot([1,5,1],'b-', label='la premiere courbe')
plt.plot([5,1,5],'m:o', label='la courbe pointillee')
plt.plot(np.arange(0,2,.2),np.arange(0,4,.4),'r^', linewidth=3, label='une droite')
plt.legend()
Out[10]:
<matplotlib.legend.Legend at 0x67eefb0>

Pour choisir l'endroit où la légende est placée dans la figure, on utilise l'option loc dans plt.legend(loc=3) :

  • loc=0 : choix automatique (optimal)

  • loc=1 : en haut à droite

  • loc=2 : en haut à gauche

  • loc=3 : en bas à gauche

  • loc=4 : en bas à droite

  • ...

Déplacez la légende dans l'exemple ci-dessus.

Fermer ses figures

Pour une bonne gestion de la mémoire, il convient de fermer ses figures quand on a terminé. La commande plt.close() ferme la figure courante, plt.close(m) ferme la figure numéro m.

In [ ]:
plt.close()
In [ ]:
plt.close(1)
plt.close(2)
plt.close(3)
plt.close(4)

Exercice Neurones (suite)

Reprenons l'exemple des données sur les neurones du notebook NB1. En fait, nous disposons de 2 autres séries de mesures du même type. Elles correspondent à des mesures sur des sujets atteints d'une maladie cérébrales, alors que la première série (que nous avons déjà étudiée) provient d'une personne en bonne santé.

L'exercice consiste à comparer les trois séries, et de répondre à la question s'il y a une différence significative entre la personne en bonne santé et les personnes malades.

  1. Les séries de mesures des personnes malades sont disponibles ici : http://www.proba.jussieu.fr/pageperso/rebafka/nerve2.csv et ici: http://www.proba.jussieu.fr/pageperso/rebafka/nerve3.csv. Importer les trois séries de mesures.

  2. Comparer les nombres de mesures par personne.

  3. Comparer les moyennes, médianes, écart-types, les quartiles, les valeurs maximales et minimales. Commenter.

  4. Pour comparer la distribution des mesures, on veut tracer leur fonctions de répartition. Rappeler la définition de la fonction de répartition. Quelle information tirée de la représentation graphique d'une fonction de répartition ?

  5. La fonction de répartition associée à des observations est une fonction en escalier. Utiliser l'aide ou l'internet pour savoir comment tracer une fonction en escalier (=step function en anglais) avec matplotlib.

  6. Tracer la fonction de répartition de la personne en bonne santé. Représenter-la par une ligne pointillée verte. Ajouter un titre, annoter les axes, et ajouter une légende.

  7. Tracer chaque fonction de répartition dans une figure à part (dans un même fenêtre). Veillez à ce que les trois fonctions sont représentées sur le même intervalle. Représenter les médianes et les quartiles par des points.

  8. Maintenant tracer la fonction de répartition des trois séries dans une même figure et faites tout pour que la figure soit jolie et facilement compréhensible pour quelqu'un d'autre : ajouter un titre, annoter les axes, utiliser des couleurs différentes et ajouter une légende.

  9. Interprétez votre dernière figure et répondez à la question s'il y a une différence significative entre la personne en bonne santé et les personnes malades.

Précision pour IDLE : Si vous utiliserez IDLE, une figure n'est affichée que quand vous le demander explicitement par l'instruction plt.show(). C'est-à-dire, on fait d'abord toutes les commandes plt.plot, plt.setp etc. et à la fin on appel plt.show().

In [ ]: