Spectre d’absorption de la chlorophylle avec Python

Un graphique coloré et facile à personnaliser.

Les données du spectre d’absorption ont été trouvées dans les annexes de cet article en ligne.

On se propose ici de tracer le spectre d’absorption de la chlorophylle a et b, avec le module Matplotlib pour le graphique, Pandas pour la récupération des données du fichier.

import matplotlib as mpl#Normalisation des valeurs
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

spectre=pd.read_csv("data-mmc3.csv",
sep=';', #séparateur de colonnes
usecols=[0, 1, 2],#sélection des colonnes utiles
)

LO=spectre["LO"]
ChlorophylleA=spectre["Chlorophyll-a"]-spectre["Chlorophyll-a"].min()
ChlorophylleB=spectre["Chlorophyll-b"]-spectre["Chlorophyll-b"].min()

Dans les deux dernières lignes du code ci-dessus, on ajuste les valeurs d’absorbance pour que le minimum soit à 0 (dans le fichier d’origine, certaines valeurs étaient négatives).

def maxlocal(bornemin, bornemax, Abs, couleur):#recherche d'un maximum local
    Lmax, Amax=0, 0
    for N, L in enumerate(LO):
        if L>=bornemin and L<= bornemax and Abs[N]>Amax:
            Lmax=L
            Amax=Abs[N]
#    plt.vlines(Lmax, ymin= 0, ymax=Amax, color='k')#tracé d'une ligne verticale
    plt.text(Lmax, Amax, "%.1f nm"%(Lmax), fontsize=9, ha='center', va='bottom', c=couleur)

La suite du code définit une fonction qui recherche un maximum local et affiche la longueur d’onde correspondante au-dessus du pic.

#Paramètres du graphique
fig, ax=plt.subplots(tight_layout=True)
plt.plot(LO, ChlorophylleA, label="Chlorophylle a")
plt.plot(LO, ChlorophylleB, label="Chlorophylle b")

plt.title("Spectre d'absorption de la chlorophylle")
plt.xlabel("longueur d'onde (nm)")
plt.ylabel("Absorbance")
plt.xticks(np.arange(350, 850, 50))
ymin, ymax=ax.get_ylim()
H=0.1*ymax#hauteur du spectre du visible
plt.ylim(-H, ymax*1.05)#fixe les bornes en ordonnées
plt.axhline(0, color='k')#une ligne horizontale à 0
plt.yticks(np.arange(0, 0.04, 0.01))#changer les graduations en Y
plt.xlim(350, 800)
plt.legend()

Ci-dessous, cette partie du code récupère les couleurs ayant été affectées aux deux courbes, pour pouvoir les passer en paramètre ensuite dans les appels de fonction. Ainsi, même si on modifie la couleur des courbes, alors les longueurs d’onde des maxima auront automatiquement les mêmes couleurs que leurs courbes.

#récupération des couleurs des courbes :
courbes=ax.get_lines()
couleur1, couleur2=courbes[0].get_color(), courbes[1].get_color()

Le code suivant choisit un “colormap” aux couleurs de l’arc-en-ciel, pour tracer le spectre coloré du domaine visible dans un rectangle sous les courbes. On pourra ainsi faire la correspondance des pics et des couleurs. Un colormap associe une gamme de couleurs à une gamme de valeurs.

Ensuite, une boucle ‘for’ parcourt les longueurs d’onde pour tracer un trait vertical dont la couleur correspond à la longueur d’onde :

#Réglages et utilisation du colormap arc-en-ciel :
cmap=plt.get_cmap('turbo')#gamme de couleurs du visible
#normalisation de la gamme de valeurs :
norm = mpl.colors.Normalize(vmin=350,vmax=800)

for L in np.arange(350, 800, 0.1):#tracé du dégradé de couleurs
    ax.vlines(L, ymin=-H, ymax=0, color=cmap(norm(L)))

Le code Python (compressé) :

Soyez le premier à commenter

Laisser un commentaire