Spectres de bandes d’absorption-Python

Avec ce code Python, on peut tracer le spectre d’absorption d’une solution (à partir de données stockées dans un fichier csv), mais aussi produire un spectre de bande d’absorption.

Dans le code, un paramètre seuil permet de régler à partir de quelle absorbance la bande est complètement noire :

Pour tracer le spectre coloré, j’utilise un colormap (association d’une valeur de longueur d’onde à une couleur. Voir un précédent article).

Pour obtenir le spectre à bandes noires, je trace au préalable un rectangle noir. Puis, je trace le colormap (lignes verticales colorées tracées une par une, ce qui prend un peu de temps). L’astuce consiste à passer un coefficient de transparence des lignes colorées relié directement à la valeur d’absorbance et au seuil. Plus on s’approche du seuil, plus la ligne verticale colorée est transparente, ce qui donne un dégradé au rendu visuel voisin de celui de l’expérience.


Les fichiers csv :


import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl#Normalisation du colormap
#import numpy as np
import matplotlib.patches as mpatches#pour le rectangle noir

LOmin=400#longueur d'onde minimale
LOmax=750#longueur d'onde maximale

#Import des données des fichiers .csv :
spectre=pd.read_csv("spectreDakin.csv", delimiter='\t')
#Filtrage des longueurs d'onde (indispensable si forte absorption UV) :
spectre=spectre[(spectre["LO"]>=LOmin) & (spectre["LO"]<=LOmax)]
LO=spectre["LO"]
A=spectre["Abs"]
if min(A)<0:#offset pour éviter A négatif
    A=A-min(A)

#Paramètres pour le colormap :
cmap=plt.get_cmap('turbo')#définition du colormap utilisé
#Attention, le colormap 'turbo' n'est pas inclus dans les installations
#matplotlib antérieures à la version 3.3.0
#normalisation de la gamme de valeurs :
norm = mpl.colors.Normalize(vmin=350,vmax=750) 

#paramètres du graphique :

fig, ax=plt.subplots(figsize=(7, 9))
ax.set_xlim(LOmin, LOmax)

plt.title("Spectre d'absorption de $KMnO_4$")
plt.xlabel("longueur d'onde (nm)")
plt.ylabel("absorbance")
#plt.grid()
hauteur=0.02#hauteur des spectres colorés, en unité d'absorbance

plt.plot(LO, A, 'k')#tracé de la courbe
ymin, ymax=ax.get_ylim()#récupérer les limites automatiques en y
ax.set_ylim(0, ymax+hauteur)

#tracé d'un rectangle noir
ax.add_artist(mpatches.Rectangle((LOmin, ymax), 400, hauteur, color='black'))

seuilA=0.90#pour régler la sensibilité du spectre de bandes, en %
#au-dessus de ce seuil, le spectre est noir (bande)

#calcul du alpha pour le spectre de bandes :
alpha=[]
for N, absorbance in enumerate(A):
    pourcentage=absorbance/max(A)
    if pourcentage>=seuilA:
        alpha.append(0)
    else:
        alpha.append(1-pourcentage/seuilA)#pour un dégradé vers le noir
    
for N, L in enumerate(LO):#spectre de bande d'absorption, au sommet du graphe
    plt.vlines(L, ymin = ymax, ymax = ymax+hauteur, color=cmap(norm(L)), alpha=alpha[N])

fig.savefig("SpectrebandeAbsorptionKMnO4.png", dpi=300)
plt.show()

Fichier Python à télécharger (compressé) :

Soyez le premier à commenter

Laisser un commentaire