Tracé d'un graphique

La bibliothèque matplolib est très utile pour tracer des graphiques.

Listes d'abscisses et d'ordonnées


Tracer un graphique avec python suppose de disposer d'un nuage de points dont les abscisses et les ordonnées sont rangées dans deux listes distinctes.

Par exemple, pour tracer la courbe représentant les variations d'une tension $\mathsf{u(t) = 3 cos(1. 10^3 t + 0,25)}$ au cours du temps, alors il faut créer :

  • une liste de valeurs de temps,
  • une liste de valeurs de la tension $\mathsf{u(t)}$.

La création de la liste des temps peut se faire de manière automatique grâce à la commance linspace de la bibliothèque numpy. Celle-ci nécessite trois arguments np.linspace(borne_inferieure , borne_superieure , nombre de points).

La liste des ordonnées associées s'obtient grâce à la définition de la fonction $\mathsf{u(t)}$ :

#La fonction cosinus doit être extraire d'une bibliothèque comme numpy ou math
def u(t) :
    return 3 * np.cos(1E3 * t + 0.25)     
Y = [u(x) for x in X]

Le tracé s'obtient alors au moyen de la commande plt.plot(X,Y).

In [ ]:
import matplotlib.pyplot as plt
import numpy as np

def u(t) :
    return 3 * np.cos(1E3 * t + 0.25)     

X=np.linspace(0,1E-2,100)
Y = [u(x) for x in X]

plt.plot(X,Y)
Out[ ]:
[<matplotlib.lines.Line2D at 0x7f9825098390>]

Tracé de plusieurs courbes sur le même graphique


Si deux fonctions doivent être tracées sur le même graphique, il faut répéter l'écriture de la commande plt.plot(abs,ord) autant de fois qu'il y a de courbes à tracer.

L'exemple ci-dessous montre d'ailleurs comment créer une liste d'ordonnées sans passer par la création d'une fonction.

In [ ]:
import matplotlib.pyplot as plt
import numpy as np

X=np.linspace(0,1E-2,100)
Y1 = [3 * np.cos(1E3*x + 0.25) for x in X]
Y2 = [2.5 * np.cos(1E3*x - 1.1) for x in X]

plt.plot(X,Y1)
plt.plot(X,Y2)

Options simples courantes


Pour chaque courbe, il est possible d'imposer une couleur, un marqueur, une épaisseur, une étiquette sous la forme : plt.plot(X,Y,'CouleurMarqueur,width='epaisseur',label='titre')

Les couleurs peuvent être indiquées au moyen de lettres :

  • b = bleu,
  • r = rouge,
  • g = green,
  • k = noir,
  • y = jaune,
  • etc.

Les marqueurs sont associés à des signes :

  • + = croix verticale,
  • x = croix oblique,
  • . = point,
  • o = rond plein,
  • - = trait plein,
  • -- = pointillé,
  • etc.

La taille du marqueur peut être spécifiée à l'aide de l'option markersize, l'épaisseur d'une ligne ou de pointillés sous la forme linewidth=2.

L'étiquette sous forme d'une chaîne de caractère : label='nom courbe'.

Le rendu esthétique du graphique est amélioré par l'addition de commandes :

  • Ajout d'un titre : plt.title("Titre")
  • Ajout d'une ligne d'abscisse : plt.axhline()
  • Ajout d'une grille : plt.grid()
  • Ajout d'une étiquette d'abscisse : plt.xlabel("Titre abscisse") ou d'ordonnée plt.ylabel("Titre ordonnée")
  • Contrôle des bornes de tracé en abscisse : plt.xlim(borne_inf,borne_sup) ou d'ordonnée plt.xlim(borne_inf,borne_sup)
  • Ajout d'une légende si plusieurs courbes sont tracées : plt.legend()

Toutes ces commandes peuvent être améliorées grâce à des arguments optionnels. Un simple clic sur le nom de la commande permet d'accéder aux options disponibles.

In [ ]:
import matplotlib.pyplot as plt
import numpy as np

X=np.linspace(0,1E-2,100)
Y1 = [3 * np.cos(1E3*x + 0.25) for x in X]
Y2 = [2.5 * np.cos(1E3*x - 1.1) for x in X]

plt.figure(1)
plt.plot(X,Y1,'b--',linewidth=1,label="tension d'entrée")
plt.plot(X,Y2,'r+',markersize=2,label="tension de sortie")
plt.xlabel('temps (s)')
plt.ylabel('tension (V)')
plt.axhline()
plt.legend()
plt.grid(rue)
plt.show()

Aligner/Organiser des graphiques


Il est possible d'imposer une organisation de graphiques verticalement et horizontalement, notamment pour faciliter des comparaisons. Cela est rendu possible par l'utilisation de commande plt.subplot(NbeLignes,NbeColonnes,Position).

In [ ]:
import matplotlib.pyplot as plt
import numpy as np

X=np.linspace(0,1E-2,100)
Y1 = [3 * np.cos(1E3*x + 0.25) for x in X]
Y2 = [2.5 * np.cos(1E3*x - 1.1) for x in X]

plt.subplot(121) #1 ligne, 2 colonnes, position n°1
plt.plot(X,Y1,'b--',label="tension d'entrée")
plt.plot(X,Y2,'r-',label="tension de sortie")
plt.xlabel('temps (s)')
plt.ylabel('Ue (V)')
plt.title("Mode temporel")
plt.axhline(y=0,linewidth=3)
plt.grid()

plt.subplot(122) #1 ligne, 2 colonnes, position n°2
plt.plot(Y1,Y2,'--',label="Mode XY")
plt.xlabel('Ue (V)')
plt.ylabel('Us (V)')
plt.title("Mode XY")
plt.grid()

plt.show()

Ajouter des barres d'erreur à des points expérimentaux


Il faut cette fois changer la commande plt.plot(X,Y) par plt.errorbar(X,Y, xerr= ,yerr= ,fmt='o') :

  • xerr attend l'amplitude des barres d'erreur en abscisse,
  • yerr attend l'amplitude des barres d'erreur en ordonnée,
  • fmt correspond à la consigne sur le format du point.
In [ ]:
import matplotlib.pyplot as plt
import numpy as np

X=np.linspace(0,2E-3,10)
Y1 = [2.5 * np.cos(1E3*x - 1.1) for x in X]

plt.figure(1)
plt.errorbar(X,Y1,yerr=.2,fmt='x',markersize=8,label="tension d'entrée")
plt.xlabel('temps (s)')
plt.ylabel('Ue (V)')
plt.title("Avec barres d'erreur pour la grandeur en ordonnée")
plt.grid()
plt.show()