Visualisation d’une fonction de 2 variables#

Nous allons voir comment visualiser une fonction de deux variables f(x, y).

Dans cette page, nous présentons deux styles de programmation :

  • le style « pyplot » qui utilise directement des fonctions du module pyplot ;

  • le style « Oriénté Objet (OO) » qui est recommandé dans la documentation de Matplotlib.

Pour plus d’informations sur la différence entre les deux syles, vous pouvez consulter la page Tracé de courbes.

Utilisation de meshgrid()#

Pour visualiser une fonction z = f(x, y) :

  • Il faut d’abord générer des tableaux X et Y (noms arbitraires) qui contiennent les valeurs des abscisses et ordonnées pour chacun des points grâce à la fonction meshgrid().

  • Ensuite il faut calculer la valeur de z pour chacun de ces points.

meshgrid() permet de générer un maillage.

>>> import numpy as np
>>> x = np.array([3, 4, 7])
>>> y = np.array([-1, 0])
>>> X, Y = np.meshgrid(x, y)
>>> X
array([[3, 4, 7],
       [3, 4, 7]])
>>> Y
array([[-1, -1, -1],
       [ 0,  0,  0]])

Utilisation de pcolormesh()#

pcolormesh() permet une visualisation grâce à des couleurs.

Style « pyplot »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

plt.pcolormesh(X, Y, Z)

plt.show()

Style « Orienté Objet »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

fig, ax = plt.subplots()
ax.pcolormesh(X, Y, Z)

plt.show()

(Source code)

_images/test_pcolormeshb.png

Affichage d’une échelle des couleurs - colorbar()#

Style « pyplot »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

plt.pcolormesh(X, Y, Z)
plt.colorbar()

plt.show()

Style « Orienté Objet »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

fig, ax = plt.subplots()
pc = ax.pcolormesh(X, Y, Z)
fig.colorbar(pc)

plt.show()

(Source code)

_images/pcolormesh_colorbarb.png

Changement de l’échelle des couleurs#

Il est possible de changer le domaine des couleurs en précisant les valeurs vmin et vmax. On peut également modifier l’échelle des couleurs (colormap) avec le paramètre cmap.

Voici un exemple avec l’échelle bwr pour blue-white-red.

Style « pyplot »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

plt.pcolormesh(X, Y, Z, vmin=-1.1, vmax = 1.1, cmap=plt.cm.bwr)
plt.colorbar()

plt.show()

Style « Orienté Objet »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

fig, ax = plt.subplots()
pc = ax.pcolormesh(X, Y, Z, vmin=-1.1, vmax = 1.1, cmap=plt.cm.bwr)
fig.colorbar(pc)

plt.show()

(Source code)

_images/pcolormesh_colorbar_bwrb.png

Note

Vous pouvez consulter les différentes échelles de couleurs avec le lien suivant : https://matplotlib.org/stable/gallery/color/colormap_reference.html

Mise en place d’un effet de fondu sur les couleurs#

On peut mettre en place un effet de fondu sur les couleurs pour éviter l’aspect quadrillage grâce à l’argument shading="gouraud".

Style « pyplot »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

plt.pcolormesh(X, Y, Z, shading="gouraud")
plt.colorbar()

plt.show()

Style « Orienté Objet »

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

fig, ax = plt.subplots()
pc = ax.pcolormesh(X, Y, Z, shading="gouraud")
fig.colorbar(pc)

plt.show()

(Source code)

_images/pcolormesh_gouraudb.png

Utilisation de imshow()#

Style « pyplot »

import numpy as np
import matplotlib.pyplot as plt

xmin = -3
xmax = 3
nbx = 51
ymin = -2
ymax = 2
nby = 41

x = np.linspace(xmin, xmax, nbx)
y = np.linspace(ymin, ymax, nby)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

plt.imshow(Z, interpolation="bicubic", 
           origin="lower", extent=[xmin,xmax,ymin,ymax])
plt.colorbar()

plt.show()

Style « Orienté Objet »

import numpy as np
import matplotlib.pyplot as plt

xmin = -3
xmax = 3
nbx = 51
ymin = -2
ymax = 2
nby = 41

x = np.linspace(xmin, xmax, nbx)
y = np.linspace(ymin, ymax, nby)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2) # calcul du tableau des valeurs de Z

fig, ax = plt.subplots()
im = ax.imshow(Z, interpolation="bicubic", 
               origin="lower", extent=[xmin,xmax,ymin,ymax])
fig.colorbar(im)

plt.show()

(Source code)

_images/test_imshowb.png

Exemple : visualisation de la fonction sinus cardinal#

Nous allons tracer la fonction sinus cardinal (plus précisément ici sin(r)/r). On va utiliser la constante prédéfinie finfo(float).eps pour lever l’indétermination de la division 0/0.

Note

finfo(float).eps est le plus petit flottant positif tel que 1.0 + eps != 1.0. eps = 2**(-52), ce qui donne approximativement 2.22e-16.

Style « pyplot »

import numpy as np
import matplotlib.pyplot as plt

epsilon = np.finfo(float).eps
print("epsilon =", epsilon)

xmin = -8
xmax = 8
nbx = 41
ymin = -8
ymax = 8
nby = 41

x = np.linspace(xmin, xmax, nbx)
y = np.linspace(ymin, ymax, nby)
X, Y = np.meshgrid(x, y)

R = np.sqrt(X**2 + Y**2) + epsilon
Z = np.sin(R) / R

plt.imshow(Z, interpolation="bicubic", 
           origin="lower", extent=[xmin,xmax,ymin,ymax])
plt.colorbar()

plt.show()

Style « Orienté Objet »

import numpy as np
import matplotlib.pyplot as plt

epsilon = np.finfo(float).eps
print("epsilon =", epsilon)

xmin = -8
xmax = 8
nbx = 41
ymin = -8
ymax = 8
nby = 41

x = np.linspace(xmin, xmax, nbx)
y = np.linspace(ymin, ymax, nby)
X, Y = np.meshgrid(x, y)

R = np.sqrt(X**2 + Y**2) + epsilon
Z = np.sin(R) / R

fig, ax = plt.subplots()
im = ax.imshow(Z, interpolation="bicubic", 
               origin="lower", extent=[xmin,xmax,ymin,ymax])
fig.colorbar(im)

plt.show()

(Source code)

_images/imshow_sincb.png