Isotopes – histogrammes (python)

Où l’on trace l’abondance relative des isotopes stables d’un élément, sous forme d’histogramme. Ce script s’appuie sur le module Python mendeleev.

J’ai déjà eu l’occasion d’utiliser le module mendeleev (ici et ). Il fournit de nombreuses données numériques sur des éléments et leurs isotopes.

Le script suivant trace un histogramme donnant les abondances naturelles des isotopes stables d’un élément. Le seul paramètre à entrer est le numéro atomique de l’élément voulu.

Le script affecte une couleur différente pour les noyaux magiques ou doublement magiques.

Si à la fois Z ET N sont des nombres magiques, alors le noyau est doublement magique, et encore plus stable. Ils sont représentés en violet.

Tous les isotopes du calcium sont magiques. L’isotope 40 est doublement magique.

La stabilité d’un nucléide dépend de nombreux paramètres ; la stabilité d’un noyau magique se manifeste différemment selon les cas : parfois le pourcentage d’abondance naturelle est élevé, parfois le nombre d’isotopes stables est élevé (comme pour l’étain, par exemple) :

Parfois le noyau magique a une très faible abondance, mais possède une composition qui devrait le rendre instable ; c’est le surcroît de stabilité dû à son caractère magique qui le rend stable. C’est le cas du soufre-36.

Un autre critère de stabilité est la parité des nucléons : si Z et N sont pairs, le noyau est plus stable.

Voici le pdf des 80 graphiques générés par le script :


Le script Python en format compressé :

Appel des modules :

import matplotlib.pyplot as plt
from mendeleev.fetch import fetch_table

Paramètres de départ :

 # Paramètres personnalisables-----
couleur_histo = 'skyblue'
couleur_magique = 'lightcoral'
couleur_doublemagique = 'blueviolet'
largeur = 0.2  # largeur des rectangles


isotopes = fetch_table('isotopes', index_col='id') # récupération des données
# ---------------------------------
ptable  =  fetch_table('elements')
isotopes  =  fetch_table('isotopes', index_col = 'id')
colonnes = ['atomic_number','mass_number','abundance','is_radioactive','mass']
donnees = isotopes[colonnes]
donnees = donnees[donnees.is_radioactive == False] # supprime les instables

Définition des fonctions :


def data(Z):
    """
    Parameters
    ----------
    Z : TYPE : (entier) : numéro atomique
    Returns
    -------
    liste x : nombres de masse des isotopes de l'élément.
    liste y = abondance des isotopes.
    """
    data = donnees[donnees.atomic_number == Z]
    data = data.dropna()  # supprime les données absentes
    liste_A = data.mass_number
    liste_abo = data.abundance
    return liste_A, liste_abo

def est_magique(Z,N):
    """
    Parameters
    ----------
    Z : TYPE entier
        DESCRIPTION = numéro atomique
    A : TYPE : entier
        DESCRIPTION nombre de neutrons
    Returns
    -------
    booléen : True si le noyau est magique.
    """
    if Z in liste_magique:
        magique = True
    elif N in liste_magique:
        magique = True
    else:magique = False
    return magique

def double_magique(Z,N):
    """
    Parameters
    ----------
    Z : TYPE entier
        DESCRIPTION = numéro atomique
    A : TYPE : entier
        DESCRIPTION nombre de neutrons
    Returns
    -------
    booléen : True si le noyau est doublement magique.
    """
    if Z in liste_magique and N in liste_magique:
        magique = True
    else:
        magique = False
    return magique

def liste_couleurs(Z, liste_A):
    """
    Parameters
    ----------
    Z : TYPE entier DESCRIPTION : numéro atomique de l'élément.
    liste_A : TYPE : liste de strings
        DESCRIPTION. : liste de nombres de masse des isotopes
    Returns
    -------
    liste_c : TYPE : liste de strings
        DESCRIPTION. : couleurs à affecter aux isotopes de l'élément.
    """
    liste_c = []
    for i in range(len(liste_A)):
        N = liste_A[i] - Z # nombre de neutrons
        if double_magique(Z, N):
            coul = couleur_doublemagique
        elif est_magique(Z, N):
            coul = couleur_magique
        else:
            coul = couleur_histo
        liste_c.append(coul)
    return liste_c

def histogramme(Z):
    """
    Parameters
    ----------
    Z : TYPE : entier
        DESCRIPTION : numéro atomique
    Returns
    -------
    Trace l'histogramme des isotopes stables et leur abondance.
    """
    # paramètres du graphique
    fig = plt.figure(tight_layout=True, facecolor='lavender')
    ax = plt.subplot(111)
    ax.set_xlabel('nombre de masse A')
    ax.set_yticks([])
    x, y = data(Z)
    if len(y) >0:
        if len(x)==1:
            ax.set_xlim(x.iloc[0]-3, x.iloc[0]+3)
        else:
            ax.set_ylim(0, max(y)+6) # laisse la place pour le %
        ax.set_xticks(range(min(x), max(x)+1)) # graduations entières en x
        couleur = liste_couleurs(Z, list(x)) # liste de couleurs pour les rectangles
        ax.bar(x, y, width = largeur, ec='k', color = couleur) # tracé de l'histogramme
        nom = noms[Z-1] # nom de l'élément en français
        ax.set_title(f"{Z}-{nom}", fontsize=12, fontweight='bold')
        labels = [f"{y.iloc[i]}%" for i in range(len(y))] # les %
        """
        Création d'une liste de couleurs pour les pourcentages (colorés si 
        l'isotope est magique, noir sinon), en remplaçant la couleur bleue
        dans la liste 'couleur' par noir.
        """
        couleurs_labels = list(map(lambda x: x.replace(couleur_histo, 'k'), couleur))
        # affichage des % :
        for i in range(len(x)):
            ax.text(x.iloc[i], y.iloc[i], labels[i], ha = 'center', va = 'bottom',
                    color = couleurs_labels[i]
                    )
        ax.text(1.005,0.02,"www.astrolabe-science.fr", c= 'grey',
                rotation=90, fontsize=6, transform=ax.transAxes)
        NomFichier = "isotopes_histo" + str(Z)
        fig.savefig(NomFichier+'.png',dpi=200)
        fig.savefig(NomFichier+'.pdf')

Le script précédent est utilisé pour constituer un tableau périodique, pour les 54 premiers éléments chimiques. La figure a les dimensions A3.

Le script (compressé) pour ce graphique :

Soyez le premier à commenter

Laisser un commentaire