** INPUT **: Daten mit beliebigen Werten für jedes Element im Periodensystem
{'H': 772, 'He': 4,
'Li': 1822, 'Be': 129, 'B': 511, 'C': 458, 'N': 755, 'F': 1756,
'Na': 1214, 'Mg': 905, ..., 'Np': 58, 'Pu': 57}
Gegen
** AUSGABE **: Wärmekarte des Periodensystems wie unten
Vorstellung der Werkzeuge, die erhältlich sind.
Dieser Artikel richtet sich hauptsächlich an Personen, die an MI: Materials Informatics beteiligt sind und normalerweise mit umfangreichen zusammengesetzten Daten umgehen. Es wird als nützlich für die Visualisierung zusammengesetzter Daten angesehen.
Die Wärmekartenzeichnung des Periodensystems ist in pymatgen.util.plotting [] implementiert, einer Open-Source-Python-Bibliothek für die Materialanalyse, die von Materials Project [] mit dem Namen pymatgen [](Python Materials Genomics) entwickelt wurde. Ich habe periodic_table_heatmap [] verwendet.
Ja. Ich habe versucht, sofort zu verwenden.
$ python -V
Python 3.7.4
Ich habe versucht, auf den Code zu verweisen, der in Testcode [] von pymatgen.util.plotting [] beschrieben ist.
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()
Auf diese Weise wurde in einem Schuss ein Wärmekartendiagramm erzeugt, das den Wert jedes Elements der angegebenen Daten widerspiegelt: "random_data". Was meinst du?
Persönlich wollte ich die folgenden Punkte des Standardcodes anordnen (als Format, das in Papieren und Präsentationen verwendet wird), also schrieb ich den Code unter Bezugnahme auf den Quellcode von periodic_table_heatmap [].
Einstellbar mit den Argumenten von [ursprüngliche Funktion] periodic_table_heatmap:
Die Farbe des Elements, das in den Daten fehlt, ist grau → Mit blank_color
anpassen
Ich möchte die Farbe und Größe der Farbleiste ändern → Mit cmap
und cbar_label_size
anpassen
Ich möchte eine Farbleistenbeschriftung hinzufügen → Mit cbar_label
anpassen
[Originalfunktion] Kann nicht mit dem Argument periodic_table_heatmap angepasst werden ** → Codeänderung erforderlich **:
Zeichnen Sie eine Linie in der Zyklustabelle
Ich möchte den Elementnamen in der Mitte platzieren
Ich möchte die Textfarbe von Elementnamen, die in den Daten fehlen, in etwas anderes als Schwarz ändern. ――Ich möchte Lantanoide und Actinoide kennzeichnen (vielleicht ist das unnötig?)
Beispielcode: ** Die Ausgabe der Heatmap von Bestandteilen beliebiger Verbindungsdaten ** ist unten gezeigt.
mp_query ()
) im folgenden Code gilt Folgendes: [Verwenden Sie die Abfragefunktion des Materialprojekts, um eine große Menge der gewünschten Berechnungsmaterialdaten zu erfassen. ] [] wird als Referenz verwendet.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()
Das Ergebnis der Ausführung des obigen Codes: periodic_table_heatmap.png
ist die Heatmap des zu Beginn gezeigten Periodensystems.
Ich wollte das früher wissen. Bis jetzt kannte ich die Existenz von periodic_table_heatmap [] nicht und zeichnete die ** Heat ** -Karte in einer ziemlich schlammigen (zu stinkenden) Methode, sodass die zusammengesetzten Daten jedes Mal aktualisiert werden * Es war * hehehe **. (Absolute Temperatur)
Ich hoffe aufrichtig, dass alle MI-Beamten diesen Artikel sehen und ihre Arbeitseffizienz steigern.
Recommended Posts