** INPUT **: Données avec des valeurs arbitraires pour chaque élément du tableau périodique
{'H': 772, 'He': 4,
'Li': 1822, 'Be': 129, 'B': 511, 'C': 458, 'N': 755, 'F': 1756,
'Na': 1214, 'Mg': 905, ..., 'Np': 58, 'Pu': 57}
Contre
** OUTPUT **: Carte thermique du tableau périodique comme ci-dessous
Présentation des outils qui peuvent être obtenus.
Cet article s'adresse principalement aux personnes impliquées dans MI: Materials Informatics, qui gèrent généralement des données composées à grande échelle. On pense qu'il est utile pour la visualisation des données composées.
Le dessin de la carte thermique du tableau périodique est implémenté dans pymatgen [](Python Materials Genomics), une bibliothèque Python open source pour l'analyse des matériaux développée par Materials Project [] pymatgen.util.plotting []. J'ai utilisé [périodique_table_heatmap] [].
Oui. J'ai essayé de l'utiliser immédiatement.
$ python -V
Python 3.7.4
J'ai essayé de me référer au code décrit dans [Test code] [] de pymatgen.util.plotting [].
periodic_table_heatmap_example.py
#!/usr/bin/env python3
from pymatgen.util.plotting import periodic_table_heatmap
# The following code is based on:https://github.com/materialsproject/pymatgen/blob/master/pymatgen/util/tests/test_plotting.py
def main():
random_data = {'Te': 0.11083818874391202,
'Au': 0.7575629917425387,
'Th': 1.2475885304040335,
'Ni': -2.0354391922547705}
plt = periodic_table_heatmap(random_data, cmap="plasma")
plt.savefig("periodic_table_heatmap.png ")
if __name__ == '__main__':
main()
De cette manière, un graphique de carte de chaleur reflétant la valeur de chaque élément des données données: random_data
a été généré en un seul coup. Que voulez-vous dire?
Personnellement, je voulais arranger les points suivants du code par défaut (comme format utilisé dans les articles et les présentations), j'ai donc écrit le code en référence au code source de [périodique_table_heatmap] [].
--Ajustable avec les arguments de [fonction originale] [périodique_table_heatmap]:
La couleur de l'élément absent des données est le gris → Ajuster avec blank_color
--Je veux changer la couleur et la taille de la barre de couleur → Ajuster avec cmap
et cbar_label_size
--Je veux ajouter une étiquette de barre de couleur → Ajuster avec cbar_label
[Fonction d'origine] Ne peut pas être ajusté avec l'argument de [périodique_table_heatmap] ** → Modification du code requise **:
Tracez une ligne réglée dans la table des cycles --Je veux placer le nom de l'élément au centre --Je souhaite changer la couleur du texte des noms d'élément absents des données en autre chose que le noir. ――Je veux étiqueter les lantanoïdes et les actinoïdes (c'est peut-être inutile)
Exemple de code: ** La sortie de la carte thermique des éléments constitutifs de données composées arbitraires ** est indiquée ci-dessous.
mp_query ()
) du code ci-dessous, l'article auto-rédigé: [Utilisez la fonction de requête du projet de matériaux pour acquérir une grande quantité de données de matériaux de calcul souhaitées. ] [] est utilisé comme référence.periodic_table_heatmap.py
#!/usr/bin/env python3
import numpy as np
import collections
from pymatgen import MPRester
from pymatgen.core.periodic_table import Element
from pymatgen.core.composition import Composition
def mp_query(YOUR_API_KEY):
mp = MPRester(YOUR_API_KEY)
# Properties you need: mp-id;
# spacegroup number; composition formula; band gap
basic_properties = ['task_id', 'spacegroup.number', 'pretty_formula']
electronic_properties = ['band_gap']
all_properties = basic_properties + electronic_properties
# Query criteria: must include O element; less than 3 types of elements;
# band gap value exists
criteria = {"elements": {"$all": ["O"]},
"nelements": {"$lte": 3},
"band_gap": {"$exists": True}}
# Retrieve material property data which satisfy query criteria
data = mp.query(criteria=criteria, properties=all_properties)
return data
# The following code is based on: https://pymatgen.org/pymatgen.util.plotting.html#pymatgen.util.plotting.periodic_table_heatmap
def plot_periodic_table_heatmap(elemental_data, cbar_label="",
cbar_label_size=14,
cmap="YlOrRd", cmap_range=None,
blank_color="grey", value_format=None,
max_row=9):
# Convert primitive_elemental data in the form of numpy array for plotting.
if cmap_range is not None:
max_val = cmap_range[1]
min_val = cmap_range[0]
else:
max_val = max(elemental_data.values())
min_val = min(elemental_data.values())
max_row = min(max_row, 9)
if max_row <= 0:
raise ValueError("The input argument 'max_row' must be positive!")
value_table = np.empty((max_row, 18)) * np.nan
blank_value = min_val - 0.01
for el in Element:
if el.row > max_row:
continue
value = elemental_data.get(el.symbol, blank_value)
value_table[el.row - 1, el.group - 1] = value
# Initialize the plt object
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.gcf().set_size_inches(12, 8)
# We set nan type values to masked values (ie blank spaces)
data_mask = np.ma.masked_invalid(value_table.tolist())
# changed edgecolors from 'w' to 'k', and linewidths from 2 to 1
heatmap = ax.pcolor(data_mask, cmap=cmap, edgecolors='k', linewidths=2,
vmin=min_val - 0.001, vmax=max_val + 0.001)
cbar = fig.colorbar(heatmap)
# Grey out missing elements in input data
cbar.cmap.set_under(blank_color)
# Set the colorbar label and tick marks
cbar.set_label(cbar_label, rotation=270, labelpad=25, size=cbar_label_size)
cbar.ax.tick_params(labelsize=cbar_label_size)
# Refine and make the table look nice
ax.axis('off')
ax.invert_yaxis()
# Label each block with corresponding element and value
for i, row in enumerate(value_table):
for j, el in enumerate(row):
if not np.isnan(el):
symbol = Element.from_row_and_group(i + 1, j + 1).symbol
# changed from i + 0.25 to i + 0.5
# fixed symbol color if the element is absent from data
if el != blank_value:
plt.text(j + 0.5, i + 0.5, symbol,
horizontalalignment='center',
verticalalignment='center', fontsize=16)
else:
plt.text(j + 0.5, i + 0.5, symbol,
color="gray",
horizontalalignment='center',
verticalalignment='center', fontsize=16)
if el != blank_value and value_format is not None:
plt.text(j + 0.5, i + 0.5, value_format % el,
horizontalalignment='center',
verticalalignment='center', fontsize=16)
# added special symbols for Lanthanoid & Actinoid elements
elif (i == 5 and j == 2) or (i == 7 and j == 1):
plt.text(j + 0.5, i + 0.5, "*",
horizontalalignment='center',
verticalalignment='center', fontsize=16)
elif (i == 6 and j == 2) or (i == 8 and j == 1):
plt.text(j + 0.5, i + 0.5, "†",
horizontalalignment='center',
verticalalignment='center', fontsize=16)
plt.tight_layout()
plt.savefig("periodic_table_heatmap.png ")
return plt
def main():
# get your API_KEY from here: https://materialsproject.org/open
YOUR_API_KEY = "YOUR_API_KEY"
data = mp_query(YOUR_API_KEY=YOUR_API_KEY)
# collecting total # of each element
elems = []
for d in data:
comp = d["pretty_formula"]
tmp = list(Composition(comp).as_dict().keys())
elems = elems + tmp
# get dictionary of {"each element": total #}
elem_data = collections.Counter(elems)
elem_data.pop("O")
plot_periodic_table_heatmap(elem_data,
cbar_label_size=16,
cbar_label="# of data",
cmap="autumn_r",
blank_color="white")
if __name__ == '__main__':
main()
Le résultat de l'exécution du code ci-dessus: period_table_heatmap.png
est la carte thermique du tableau périodique affiché au début.
Je voulais le savoir plus tôt. Jusqu'à présent, je ne connaissais pas l'existence de [Period_table_heatmap] [] et dessinais la ** heat ** map dans une méthode plutôt boueuse (trop malodorante et peu disposée à introduire), donc chaque fois que les données composées sont mises à jour * C'était * hehehe **. (température absolue)
J'espère sincèrement que tous les responsables de MI verront cet article et amélioreront leur efficacité au travail.
Recommended Posts