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.