Tendances dans le tableau périodique

Où l’on repeint le tableau périodique en utilisant des colormaps

Prenez un jeu de données sur le tableau périodique : un fichier de format .csv de listes de données indiquant pour chaque élément son nom, symbole, électronégativité, rayon atomique, température de fusion, et autres.

J’ai trouvé un tel jeu de données dans le catalogue du site www.datastro.eu/

J’ai ajouté à ce fichier deux colonnes indiquant les coordonnées de l’élément dans le tableau (n° de ligne et de colonnes). Ce n’est pas trop long à faire. Enfin, j’ai trié les données pour avoir un numéro atomique croissant.

#source : www.datastro.eu/;;;;;;;;;(pm);;(kJ/mol);;;;;;;;;
Atomic Number;Symbol;Name;ligne;colonne;Year Discovered;Atomic Mass;Electronic Configuration;Electronegativity;Atomic Radius;Ion Radius;Ionization Energy;Electron Affinity;Oxidation States;Standard State;Bonding Type;Melting Point;Boiling Point;Density;Group Block;Van Del Waals Radius
1;H;Hydrogen;1;1;1766;1.00794(4);1s1;2.2;37;;1312;-73;-1, 1;gas;diatomic;14;20;8.99E-05;nonmetal;120
2;He;Helium;1;18;1868;4.002602(2);1s2;;32;;2372;0;;gas;atomic;;4;0.0001785;noble gas;140
3;Li;Lithium;2;1;1817;6.941(2);[He] 2s1;0.98;134;76 (+1);520;-60;1;solid;metallic;454;1615;0.535;alkali metal;182
4;Be;Beryllium;2;2;1798;9.012182(3);[He] 2s2;1.57;90;45 (+2);900;0;2;solid;metallic;1560;2743;1.848;alkaline 

Peu lisible, vu comme ça. On peut améliorer en remplaçant les points-virgules par des tabulations (caractère \t), dans un logiciel d’éditeur de texte (Gedit, Bloc-Notes…) :

#source : www.datastro.eu/									(pm)		(kJ/mol)									
Atomic Number	Symbol	Name	ligne	colonne	Year Discovered	Atomic Mass	Electronic Configuration	Electronegativity	Atomic Radius	Ion Radius	Ionization Energy	Electron Affinity	Oxidation States	Standard State	Bonding Type	Melting Point	Boiling Point	Density	Group Block	Van Del Waals Radius
1	H	Hydrogen	1	1	1766	1.00794(4)	1s1	2.2	37		1312	-73	-1, 1	gas	diatomic	14	20	8.99E-05	nonmetal	120
2	He	Helium	1	18	1868	4.002602(2)	1s2		32		2372	0		gas	atomic		4	0.0001785	noble gas	140
3	Li	Lithium	2	1	1817	6.941(2)	[He] 2s1	0.98	134	76 (+1)	520	-60	1	solid	metallic	454	1615	0.535	alkali metal	182
4	Be	Beryllium	2	2	1798	9.012182(3)	[He] 2s2	1.57	90	45 

Le mieux est encore d’ouvrir le fichier .csv avec son logiciel de tableur préféré (LibreOffice, par exemple). Cela vous donnera une bonne idée de l’agencement des colonnes de données :

Mais alors attention ! Le logiciel de tableur a tendance à mettre la pagaille dans le fichier :

  • à l’ouverture du fichier, il faut bien indiquer le caractère séparateur de colonnes (ici, le point-virgule ET UNIQUEMENT CELUI-CI)
  • à la fermeture du fichier, il faut veiller à ce que ce caractère délimiteur ne soit pas changé.

Avec un tel fichier, on peut tracer un tableau périodique (grâce aux coordonnées (lignes, colonnes), au symbole et au numéro atomique de chaque élément).

On peut aussi demander au programme d’aller chercher les valeurs d’une grandeur (électronégativité, température de fusion, …), et d’utiliser un colormap pour rendre visible l’évolution de cette grandeur dans le tableau périodique. Un colormap associe une série de valeurs à un dégradé de couleurs : la valeur minimale correspond à la première couleur du dégradé, et le maximum à la dernière couleur. Ça donne ceci :

Pour chaque élément, un carré coloré est affiché. Sa couleur est associée à un colormap (le dégradé situé en bas) relié à la température de fusion de l’élément.

Oui, je sais, le carbone semble avoir une température de fusion supérieure à celle du tungstène : en fait, le jeu de données indique pour le carbone la température de sublimation. Si vous préférez, vous pouvez supprimer la valeur correspondante dans le fichier .csv : la case du carbone apparaîtra blanche (absence de donnée).

Il existe plusieurs catégories de colormaps ; pour ce document, le plus indiqué est un colormap séquentiel, qui part du blanc jusqu’à une couleur de plus en plus intense.

import matplotlib.pyplot as plt
import matplotlib as mpl#Normalisation des valeurs
import matplotlib.patches as mpatches#pour les carrés
import matplotlib.colorbar as cbar#barres de couleurs
import pandas as pd #lecture des fichiers csv
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable#positionner les barres de couleurs

#Extraction des données du fichier .csv :
donnees=pd.read_csv("periodic-table.csv", delimiter=';', skiprows=1)
symbole=donnees["Symbol"]
ligne=donnees["ligne"]
Z=donnees["Atomic Number"]
colonne=donnees["colonne"]

"""
Les données atomiques sont à choisir parmi :
Electronegativity
Atomic Radius
Ion Radius
Ionization Energy
Electron Affinity
Melting Point
Boiling Point
Density
Van Del Waals Radius

Les colormaps sont à choisir parmi les séquentiels :
'Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',
'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',
'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn'
"""

a=3#espace horizontal
b=3#espace vertical
#############################################
# FONCTION :
def numeroscolonnes():#numérote les colonnes en haut
    for i in np.arange(1, 19):
        plt.text(a*(i-0.2), -0.4, "%s"%(i), fontsize=8, color='gray')


#############################################

plt.rcParams["font.family"] = "Ubuntu"#ou autre police installée
#paramètres du graphique
fig=plt.figure(figsize=(7,6), tight_layout=True)
"""
Attention, en modifiant les dimensions (figsize, et valeurs des paramètres a et b, les tailles des polices
devront sans doute être réajustées.
"""
plt.title("Température de fusion dans le tableau périodique", fontsize=16)

ax1=plt.subplot(111)
ax1.set_aspect('equal')

plt.xlabel("Température de fusion (K)")
plt.xticks([])
plt.yticks([])
#plt.axis('off')#retire le cadre du graphe
plt.ylim(-12*b, 1)

#gamme de couleurs choisie (colormap) :
cmap=plt.get_cmap('RdPu')
critereCouleur=donnees["Melting Point"]#choix de la grandeur
#normalisation de la gamme de valeurs :
norm = mpl.colors.Normalize(vmin=min(critereCouleur),vmax=max(critereCouleur)) 

#tracé des cases :
for i in range(len(donnees)):
    plt.text(a*colonne[i], -b/2-b*ligne[i], symbole[i], fontsize=10, va='bottom', ha='center')#symbole
#    plt.text(a*colonne[i], -b/2-b*(ligne[i]+0.3),int(Z[i]), fontsize=6, ha='center')#écriture N° atomique
    plt.scatter(a*colonne[i], -b*ligne[i], alpha=0.0)
    ax1.add_artist(mpatches.Rectangle((-a*0.5+a*colonne[i], -b*ligne[i]), a, -b, color=cmap(norm(critereCouleur[i]))))

numeroscolonnes()

#tracé de la barre de couleurs :
divider = make_axes_locatable(ax1)
cax = divider.append_axes('bottom', size='8%', pad=0.3)
cb=cbar.ColorbarBase(cax, cmap=cmap, norm=norm, orientation='horizontal')

#----------------------------------------------------------------------------------------

fig.savefig("TableauPeriodiqueTFusion.png", dpi=400)
plt.show()

En changeant le colormap et la grandeur (donc la colonne des données), on passe facilement à un autre document très riche en chimie :

Dans ce dernier exemple, beaucoup de lignes ne sont pas renseignées dans le fichier .csv : ce sont les cases blanches.

Soyez le premier à commenter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.