Visualisation 3D d’une fonction réelle de deux variables (de ℝ² dans ℝ) avec Python -matplotlib

Joséphine Picot
5 min readNov 15, 2020
Représentation interactive d’une fonction de R² dans R (Image by author)

Dans ce tutoriel nous allons voir comment représenter une fonction de ℝ² dans ℝ en 3 dimensions et de manière interactive avec python.

PS : Si vous avez déjà suivi le tutoriel “Visualisation des cercles de niveau d’une fonction réelle”, vous pouvez passer directement à la partie “Visualisation” de ce tutoriel car la préparation des données est la même.

Tout d’abord quelques librairies sont nécessaires :

installation

pip install numpy
pip install matplotlib

importation

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits
from mpl_toolkits.mplot3d import Axes3D

Si vous avez une erreur lors de l’importation de mpl_toolkit, essayez d’exécuter la commande suivante :

!pip install — upgrade matplotlib
import mpl_toolkits

Étapes de préparation

Soit une fonction f de ℝ² dans ℝ. Pour tout couple (x, y) dans ℝ², on a

f(x, y) = 2*x² — x*y + 2*y²

On définit la fonction f en python :

def f(x, y):
return 2*x**2 - x*y + 2*y**2

On choisit un intervalle de valeurs dans l’ensemble des réels ℝ pour x et y (je prendrai pour exemple [-100, 100] avec 100 valeurs pour chaque variable).

x = np.linspace(-100, 100, 100)
y = np.linspace(-100, 100, 100)

Nous allons ensuite créer un tableau de valeurs contenant tous les couples de valeur (xi, yi) pour xi parcourant x, et yi parcourant y, comme illustré ci-dessous.

Mapping de x et y entre -100 et 100 (Image by author)
X, Y = np.meshgrid(x, y)

Puis on calcule les valeurs de notre fonction f définie plus haut, et on stock ces valeurs dans une nouvelle variable Z :

Z = f(X,Y)

Après cela, nous n’avons qu’à afficher Z en fonction de X et Y :

Visualisation interactive

Si votre algorithme tourne sur un notebook (exemple Jupyter Notebook) alors, pour une visualisation interactive où l’on peut faire pivoter la figure en 3 dimensions, précisez la commande suivante :

%matplotlib notebook

Visualisation

fig = plt.figure()ax = plt.axes(projection='3d')ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='jet', edgecolor='none')
Image by author

On peut aller plus loin et ajouter un titre, légender les axes, choisir la taille de la figure, jouer sur la taille des cellules de la figure (les paramètres rstride et cstride), modifier l’échelle de couleur cmap (j’ai mis une liste de valeurs possibles pour cmap en bas de page dans la section bonus), …

Un exemple plus complet

# On définit la taille de la figure
fig = plt.figure(figsize = (10,7))
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='jet', edgecolor='none')
# On légende la figure et on fixe une taille avec fontsize
ax.set_title("Surface", fontsize = 13)
ax.set_xlabel('x', fontsize = 11)
ax.set_ylabel('y', fontsize = 11)
ax.set_zlabel('Z', fontsize = 10)
Image by author

Voilà qui est plus propre!

Pour exécuter tout en une fois vous pouvez prendre le code suivant :

code complet

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook
def f(x, y):
return 2*x**2 - x*y + 2*y**2
x = np.linspace(-100, 100, 100)
y = np.linspace(-100, 100, 100)
X, Y = np.meshgrid(x, y)
Z = f(X,Y)
fig = plt.figure(figsize = (10,7))
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='jet', edgecolor='none')
ax.set_title("Surface", fontsize = 13)
ax.set_xlabel('x', fontsize = 11)
ax.set_ylabel('y', fontsize = 11)
ax.set_zlabel('Z', fontsize = 10)

Bonus

Un autre exemple avec le code complet :

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook
def fonction1 (x, y):
return 2*x**2 - x*y**2 + 2*y**2
x = np.linspace(-400, 400, 100)
y = np.linspace(-400, 400, 100)
X, Y = np.meshgrid(x, y)
Z = fonction1(X,Y)
fig = plt.figure(figsize = (10,7))
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=5, cstride=5,
cmap='cool')
ax.set_title("Surface Bonus", fontsize = 13)
ax.set_xlabel('x', fontsize = 11)
ax.set_ylabel('y', fontsize = 11)
ax.set_zlabel('Z', fontsize = 11)
plt.show()
Image by author

Choix de cmap

cmap peut prendre une multitude de valeurs, mais voici d’abord quelques exemples pour vous faire une idée :

Image by author
Image by author

Enfin, pour un effet psychédélique :

Image by author

Les valeurs possibles de cmap :

‘Accent’, ‘Accent_r’, ‘Blues’, ‘Blues_r’, ‘BrBG’, ‘BrBG_r’, ‘BuGn’, ‘BuGn_r’, ‘BuPu’, ‘BuPu_r’, ‘CMRmap’, ‘CMRmap_r’, ‘Dark2’, ‘Dark2_r’, ‘GnBu’, ‘GnBu_r’, ‘Greens’, ‘Greens_r’, ‘Greys’, ‘Greys_r’, ‘OrRd’, ‘OrRd_r’, ‘Oranges’, ‘Oranges_r’, ‘PRGn’, ‘PRGn_r’, ‘Paired’, ‘Paired_r’, ‘Pastel1’, ‘Pastel1_r’, ‘Pastel2’, ‘Pastel2_r’, ‘PiYG’, ‘PiYG_r’, ‘PuBu’, ‘PuBuGn’, ‘PuBuGn_r’, ‘PuBu_r’, ‘PuOr’, ‘PuOr_r’, ‘PuRd’, ‘PuRd_r’, ‘Purples’, ‘Purples_r’, ‘RdBu’, ‘RdBu_r’, ‘RdGy’, ‘RdGy_r’, ‘RdPu’, ‘RdPu_r’, ‘RdYlBu’, ‘RdYlBu_r’, ‘RdYlGn’, ‘RdYlGn_r’, ‘Reds’, ‘Reds_r’, ‘Set1’, ‘Set1_r’, ‘Set2’, ‘Set2_r’, ‘Set3’, ‘Set3_r’, ‘Spectral’, ‘Spectral_r’, ‘Wistia’, ‘Wistia_r’, ‘YlGn’, ‘YlGnBu’, ‘YlGnBu_r’, ‘YlGn_r’, ‘YlOrBr’, ‘YlOrBr_r’, ‘YlOrRd’, ‘YlOrRd_r’, ‘afmhot’, ‘afmhot_r’, ‘autumn’, ‘autumn_r’, ‘binary’, ‘binary_r’, ‘bone’, ‘bone_r’, ‘brg’, ‘brg_r’, ‘bwr’, ‘bwr_r’, ‘cividis’, ‘cividis_r’, ‘cool’, ‘cool_r’, ‘coolwarm’, ‘coolwarm_r’, ‘copper’, ‘copper_r’, ‘cubehelix’, ‘cubehelix_r’, ‘flag’, ‘flag_r’, ‘gist_earth’, ‘gist_earth_r’, ‘gist_gray’, ‘gist_gray_r’, ‘gist_heat’, ‘gist_heat_r’, ‘gist_ncar’, ‘gist_ncar_r’, ‘gist_rainbow’, ‘gist_rainbow_r’, ‘gist_stern’, ‘gist_stern_r’, ‘gist_yarg’, ‘gist_yarg_r’, ‘gnuplot’, ‘gnuplot2’, ‘gnuplot2_r’, ‘gnuplot_r’, ‘gray’, ‘gray_r’, ‘hot’, ‘hot_r’, ‘hsv’, ‘hsv_r’, ‘inferno’, ‘inferno_r’, ‘jet’, ‘jet_r’, ‘magma’, ‘magma_r’, ‘nipy_spectral’, ‘nipy_spectral_r’, ‘ocean’, ‘ocean_r’, ‘pink’, ‘pink_r’, ‘plasma’, ‘plasma_r’, ‘prism’, ‘prism_r’, ‘rainbow’, ‘rainbow_r’, ‘seismic’, ‘seismic_r’, ‘spring’, ‘spring_r’, ‘summer’, ‘summer_r’, ‘tab10’, ‘tab10_r’, ‘tab20’, ‘tab20_r’, ‘tab20b’, ‘tab20b_r’, ‘tab20c’, ‘tab20c_r’, ‘terrain’, ‘terrain_r’, ‘twilight’, ‘twilight_r’, ‘twilight_shifted’, ‘twilight_shifted_r’, ‘viridis’, ‘viridis_r’, ‘winter’, ‘winter_r’

--

--

Joséphine Picot

We can do so many things with data, we just have to find a project that thrills us!