J’ai déjà eu l’occasion d’utiliser le module mendeleev (ici et là). 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.
Les noyaux dits « magiques » sont tels que leur numéro atomique Z ou leur nombre de neutrons N ait l’une des valeurs suivantes : 2, 8, 20, 28, 50, 82, 126, ce qui leur confère une plus grande stabilité. Ils sont représentés en orange.
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.
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')
Abondance isotopique sous forme de tableau périodique
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 :
Be First to Comment