Olivier Guibé - LMRS, fortement inspiré d'un document de Pierre Navaro (IRMAR).

Début avec matplotlib

  • Tracé en 2D (interactif, export dans différents formats, etc)
  • Très puissant
  • Tracé de fonctions, histogrammes, champs de vecteur, de nuages de points, courbes paramétrées, etc., en quelques lignes (normalement)
  • Voir la galerie Matplotlib.
  • Pour les graphiques 2D de base, le module pyplot donne un équivalent à MATLAB (et de Scilab) du point de vue de la syntaxe. Combiné à Ipython (graphique dans la console et pas à l'extérieur) c'est presque Matlab
  • Pas de dépaysement

Il est nécessaire d'utiliser des commandes de Numpy, voir Notebook ultérieur,

Tracer des lignes, des points (sans Numpy)

In [5]:
from math import sin
import matplotlib.pyplot as plt
xpt=[i/50 for i in range(0,200)]
ypt=[sin(i) for i in xpt]
plt.plot(xpt,ypt)
plt.show();
In [6]:
from math import sin
import matplotlib.pyplot as plt
xpt=[i/10 for i in range(0,50)]; ypt=[sin(i) for i in xpt]
plt.plot(xpt,ypt,'+r');
plt.show();

Ce n'est pas très pratique. Passons à Numpy

Tracer des lignes, des points (avec Numpy)

Le minimum utilisé avec Numpy:

  • np.linspace(0,1,11) retourne la subdivision équidistante de $[0,1]$ à 11 points
  • np.sin ou le sinus de Numpy est vectorisé. np.sin(np.linspace(0,1,11)) est équivalent à [sin(i/10) for i in range(0,11)]
In [7]:
import numpy as np  # usage courant
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10.0, 6.0) # figure plus grande
x = np.linspace(- 3*np.pi,3*np.pi,50) 
plt.plot(x,np.sin(x)/x,'og') #par chance 0 n'est pas dans x !
plt.show()
In [22]:
# deux courbes
plt.plot(x,np.sin(x)/x,x,np.sin(2*x)/x);
In [13]:
# des petits marqueurs colorés
plt.plot(x,np.sin(x)/x, 'r-^',x,np.sin(2*x)/x, 'b-o');

Un nuage de points

In [14]:
x = np.linspace(-1,1,50)
y = np.sqrt(1-x**2)
plt.scatter(x,y);

Nuages de points et niveaux de couleurs

In [15]:
theta = np.linspace(0,6*np.pi,50) # 50 points équidistants de [0, 6pi]
size = 30*np.ones(50) # un tableau de taille 50 rempli de 30
z = np.random.rand(50) # 50 valeurs aléatoires entre 0 et 1
x = theta*np.cos(theta) ; y = theta*np.sin(theta)
plt.scatter(x,y,size,z) ; plt.colorbar();

Plusieurs figures

In [26]:
plt.figure()
plt.plot(x)
plt.figure()
plt.plot(z,'ro');

Plusieurs graphiques avec subplot

In [16]:
plt.subplot(1,2,1) # 1 ligne 1, 2 colonnes, No 1 actif
plt.plot(x,'b-*')
plt.subplot(1,2,2) # 1 ligne, 2 colonnes, No 2 actif
plt.plot(z,'ro');

Des légendes

Rien de mieux que d'ajouter des légendes

In [9]:
theta =np.linspace(0,4*np.pi,200)
plt.plot(np.sin(theta), label='sin')
plt.plot(np.cos(theta), label='cos')
plt.legend();
  • une autre méthode avec la commande legend
In [12]:
plt.plot(np.sin(theta))
plt.plot(np.cos(theta)**2)
plt.legend(['sin','$\cos^2$']);

Titres et étiquettes sur les axes

In [11]:
plt.plot(theta,np.sin(theta))
plt.xlabel('radians de 0 à $4\pi$') # $4\pi$ est compris comme une commande LaTeX
plt.ylabel('amplitude');

Échelle logarithmique

In [33]:
t = np.arange(0.01, 20.0, 0.01)
# log y axis
plt.subplot(121)
plt.semilogy(t, np.exp(-t/5.0))
plt.title('semilogy')
plt.grid(True)

# log x axis
plt.subplot(122)
plt.semilogx(t, np.sin(2*np.pi*t))
plt.title('semilogx')
plt.grid(True)
plt.show();
In [34]:
plt.loglog(t, 20*np.exp(-t/10.0), basex=2)
plt.grid(True)
plt.title('loglog base 2 on x');

Exporter les figures

In [35]:
theta = np.linspace(0,2*np.pi,100)
plt.plot(np.cos(theta),np.sin(theta))
plt.grid();
In [36]:
plt.savefig('circle.png');
%ls *.png
circle.png
<matplotlib.figure.Figure at 0x7f2cf5588b38>

Histogrammes

In [37]:
from numpy.random import randn
plt.hist(randn(1000));

Contour

In [18]:
x = y = np.arange(-2.0*np.pi, 2.0*np.pi+0.01, 0.01)
X, Y = np.meshgrid(x, y)
Z = np.sin(X)*np.cos(Y)


plt.contourf(X, Y, Z,cmap=plt.cm.hot);