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 syntaxes : la syntaxe “PyLab” qui est proche de celle de Matlab et la syntaxe “standard” qui est recommandée dans les nouvelles versions de matplotlib.

Pour plus d’informations sur la différence entre les deux syntaxes, 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 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 pcolor()

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

Syntaxe “PyLab”

from pylab import *

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

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

pcolor(X, Y, Z)

show()

Syntaxe “standard”

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.pcolor(X, Y, Z)

plt.show()

(Source code)

_images/test_pcolora.png

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

Syntaxe “PyLab”

from pylab import *

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

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

pcolor(X, Y, Z)
colorbar()

show()

Syntaxe “standard”

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.pcolor(X, Y, Z)
plt.colorbar()

plt.show()

(Source code)

_images/pcolor_pcolorbara.png

Changement de l’échelle des couleurs

>>> help(colormaps)

Syntaxe “PyLab”

from pylab import *

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

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

pcolor(X, Y, Z, cmap=cm.hot)
colorbar()

show()

Syntaxe “standard”

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.pcolor(X, Y, Z, cmap=plt.cm.hot)
plt.colorbar()

plt.show()

(Source code)

_images/pcolor_pcolorbar_hota.png

Les autres choix possibles sont : autumn, bone, cool, copper, flag, gray, hot, hsv, jet, pink, prism, spring, summer, winter, spectral.

Utilisation de pcolormesh()

Syntaxe “PyLab”

from pylab import *

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

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

pcolormesh(X, Y, Z)
colorbar()

show()

Syntaxe “standard”

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()

(Source code)

_images/test_pcolormesha.png

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".

Syntaxe “PyLab”

from pylab import *

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

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

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

show()

Syntaxe “standard”

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()

(Source code)

_images/pcolormesh_gourauda.png

Utilisation de imshow()

Syntaxe “PyLab”

from pylab import *

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

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

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

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

show()

Syntaxe “standard”

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()

(Source code)

_images/test_imshowa.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.

Syntaxe “PyLab”

from pylab import *

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

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

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

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

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

show()

Syntaxe “standard”

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()

(Source code)

_images/imshow_sinca.png