Ce tutoriel est en cours de rédaction / approbation.

Tracés 3D avec colormesh

Il est possible de réaliser des tracés en 3D avec Matplotlib mais il peut être souvent plus pertinent pour une meilleure lisiblité de réaliser un tracé à l’aide de “colormesh” qui ajoute une barre nous permettant de représenter la 3ème dimension à partir de données d’un array 2D

Set de données

On s’intéresse pour cette partie à l’image diffractée d’une source lumineuse placée à une certaine distance, à travers un disque d’un diamètre donné. Cette relation entre la taille de la tâche d’Airy (résultant de cette diffraction) et les différents éléments géométriques du système peut être établie à l’aide des fonctions de Bessel (que l’on trouve dans le module special de la bibliothèque Scipy).

from scipy.special import jn
def J1(eta):
    return jn(1,eta)

L’intensité lumineuse en une position (x,y) d’un plan placé à une distance D de la source, de luminosité L0 à une longueur d’onde lam, d’un trou de diamètre d peut être donnée par la relation suivante :

def diffraction_trou(x, y, d, L0, lam, D):
    eta = np.pi*d*np.sqrt(x**2+y**2)/(lam*D)
    return (4*L0*(jn(1,eta)/eta)**2)

On prendra pour la suite les valeurs suivantes pour la simulation :

d = 0.1*10**-4 # Diamètre du trou circulaire en m
lam = 500*10**(-9)   # Longueur d'onde en nm
D = 3  # Distance en m entre l'écran et le trou de diffraction
L0 = 10  # intensité lumineuse de la source

Génération d’une grille

x = np.linspace(-1,1,1000)  # Grille en X
y = np.linspace(-1,1,1000)  # Grille en Y

xx, yy = np.meshgrid(x,y) #Nous permet d'obtenir une "grille" 2D à partir de deux arrays

Tracé 3D

from matplotlib import pyplot as plt
fig = plt.figure(figsize=(15,10))
ax = plt.axes(projection="3d")
surf = ax.plot_surface(xx, yy, diffraction_trou(xx, yy, d, L0, lam, D))
plt.title("Figure de diffraction par un trou en 3D")
plt.show()

On obtient alors la figure suivante :

Autres solutions

#Tracé des données en 3D avec colormesh
fig = plt.figure(figsize=(15,10))
plt.pcolormesh(xx,yy,diffraction_trou(xx, yy, d, L0, lam, D),shading="nearest")
plt.axis("square") # Cette fonction sert à fixer le ratio de la largeur et de la lon guer de la figure à 1:1
cbar = plt.colorbar() # On ajoute une barre qui sert d'échelle pour la 3ème dimension que nous représentons
cbar.set_label("Intensité lumineuse") # On change le nom de la barre
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Figure de diffraction par un trou avec colormesh")
plt.show()
#Tracé des données en 3D avec colormesh en échelle logarithmique
fig = plt.figure(figsize=(15,10))
plt.pcolormesh(xx,yy,np.log(diffraction_trou(xx, yy, d, L0, lam, D)),shading="nearest", cmap='gray')
plt.axis("square")    # Cette fonction sert à fixer le ratio de la largeur et de la lon guer de la figure à 1:1
cbar = plt.colorbar() # On ajoute une barre qui sert d'échelle pour la 3ème dimension que nous représentons
cbar.set_label("Log de l'intensité lumineuse")  # On change le nom de la barre
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Figure de diffraction par un trou avec colormesh")
plt.show()

https://lense.institutoptique.fr/ressources/MINE/Tutoriels/Python/MINE_Python_Matplotlib_Affichage3D.png

Ce tutoriel a été co-écrit par Corentin LE PENDU (promo 2024) dans le cadre d’une semaine spécifique.

Python / Matplotlib / Graphiques 3D