Visualisation _ Cercles de niveau _ python

Joséphine Picot
4 min readNov 16, 2020

Dans cet article je vous montre comment représenter une fonction de ℝ² dans ℝ du point de vue de ses cercles de niveau. Voici quelques exemples de visualisations que vous serez capables de générer :

Image by author

PS : Si vous avez déjà suivi le tutoriel “Visualisation 3D d’une fonction de ℝ² dans ℝ avec Python”, vous pouvez passer directement à la partie “Visualisation” de ce tutoriel car la préparation des données est la même.

Tout d’abord il y a quelques librairies python à installer/importer :

installation

pip install numpy
pip install matplotlib

importation

import numpy as np
import matplotlib.pyplot as plt

Préparation des données

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 R 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

fig = plt.figure()contours = plt.contour(X, Y, Z)plt.title("Cercles de niveau de notre fonction", fontsize=13)plt.xlabel('x', fontsize=11)plt.ylabel('y', fontsize=11)plt.show()
Image by author

Bon c’est pas incroyable! Heureusement, on peut aller plus loin et choisir le nombre de cercles de niveau (levels : ici levels = 5 par défault), définir la taille de la figure (figsize), afficher les valeurs des cercles de niveau (plt.clabel), choisir la taille des caractères affichés sur les cercles de niveau (fontsize), ajouter une échelle de couleurs (colorbar), modifier l’échelle de couleur (cmap : je mets une liste de valeurs possibles pour cmap) ..

Un exemple plus complet

fig = plt.figure(figsize = (10,7))contours = plt.contour(Z, levels = 20, cmap = 'jet')plt.clabel(contours, inline = True, fontsize = 9)plt.title("Cercles de niveau de notre fonction", fontsize=13)plt.xlabel('x', fontsize=11)plt.ylabel('y', fontsize=11)plt.colorbar()plt.show()
Image by author

C’est quand même plus beau!

Une variante des cercles de niveau

On peut également représenter les variations de notre fonction en 2D de manière continue, avec des intensités de couleurs. Ceci revient à regarder un graphique en 3 dimensions d’en haut.

fig = plt.figure(figsize = (10,7))plt.imshow(Z, extent = [-100,100,-100,100], origin = 'lower', cmap = 'hot', alpha = 1)plt.title("Cercles de niveau de notre fonction", fontsize=13)plt.xlabel('x', fontsize=11)plt.ylabel('y', fontsize=11)plt.colorbar()plt.show()
Image by author

Conclusion

On a vu plusieurs manières de représenter une fonction de ℝ² dans ℝ avec ses cercles de niveau, cela peut être utile dans de nombreux cas comme par exemple la représentation de l’évolution d’une fonction de coût lors de la descente de gradient, comme sur le screen ci-dessous :

Evolution de la fonction de coût lors de la descente de gradient (Image by author)

Si vous voulez aller plus loin et tracer l’évolution d’une fonction de coût pendant la descente de gradient, je vous suggère de jeter un œil à cet article!

Bonus

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!