[PYTHON] Incontournable pour les responsables de l'informatique des matériaux! Visualisez les données composées avec une carte thermique de tableau périodique.

Que présenter dans cet article

** 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

periodic_table_heatmap.png

Présentation des outils qui peuvent être obtenus.

Pour quel genre de personnes?

053b6d93.jpg

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.

Ce que j'ai utilisé

077aa480-e6c3-11e9-8b3e-3f7049fb9310.png

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] [].

J'ai essayé de l'utiliser

Oui. J'ai essayé de l'utiliser immédiatement.

environnement

$ python -V
Python 3.7.4

Code d'exécution

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()

Résultat d'exécution

periodic_table_heatmap.png

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?

Je veux un diagramme de sortie plus élaboré

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]:

Exemple de code: ** La sortie de la carte thermique des éléments constitutifs de données composées arbitraires ** est indiquée ci-dessous.

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.

periodic_table_heatmap.png

Impressions

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.

référence

Recommended Posts

Incontournable pour les responsables de l'informatique des matériaux! Visualisez les données composées avec une carte thermique de tableau périodique.
Folium: Visualisez les données sur une carte avec Python
Organisez les données d'achat individuelles dans un tableau avec le MultiLabel Binarizer de scikit-learn
Carte thermique pour la recherche de grille avec Matplotlib