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.
Une version avec des cercles :
Soyez le premier à commenter