Visualisation 3D d’une fonction réelle de deux variables (de ℝ² dans ℝ) avec Python -matplotlib
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.
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')
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)
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 notebookdef f(x, y):
return 2*x**2 - x*y + 2*y**2x = 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 notebookdef fonction1 (x, y):
return 2*x**2 - x*y**2 + 2*y**2x = 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()
Choix de cmap
cmap peut prendre une multitude de valeurs, mais voici d’abord quelques exemples pour vous faire une idée :
Enfin, pour un effet psychédélique :
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’