« home

Materials Project Element Distribution by Arity

# dash needed for interactive plots
!pip install pymatviz dash
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: pymatviz in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (0.12.0)
Requirement already satisfied: dash in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (2.18.1)
Requirement already satisfied: matplotlib>=3.9 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatviz) (3.9.2)
Requirement already satisfied: numpy>=1.26 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatviz) (1.26.4)
Requirement already satisfied: pandas>=2.2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pandas[output-formatting]>=2.2->pymatviz) (2.2.3)
Requirement already satisfied: plotly>=5.23 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatviz) (5.24.1)
Requirement already satisfied: pymatgen>=2024.7.18 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatviz) (2024.10.3)
Requirement already satisfied: scikit-learn>=1.5 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatviz) (1.5.2)
Requirement already satisfied: scipy>=1.14 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatviz) (1.14.1)
Requirement already satisfied: Flask<3.1,>=1.0.4 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (3.0.3)
Requirement already satisfied: Werkzeug<3.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (3.0.4)
Requirement already satisfied: dash-html-components==2.0.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (2.0.0)
Requirement already satisfied: dash-core-components==2.0.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (2.0.0)
Requirement already satisfied: dash-table==5.0.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (5.0.0)
Requirement already satisfied: importlib-metadata in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (8.5.0)
Requirement already satisfied: typing-extensions>=4.1.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (4.12.2)
Requirement already satisfied: requests in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (2.32.3)
Requirement already satisfied: retrying in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (1.3.4)
Requirement already satisfied: nest-asyncio in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (1.6.0)
Requirement already satisfied: setuptools in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from dash) (75.1.0)
Requirement already satisfied: Jinja2>=3.1.2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from Flask<3.1,>=1.0.4->dash) (3.1.4)
Requirement already satisfied: itsdangerous>=2.1.2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from Flask<3.1,>=1.0.4->dash) (2.2.0)
Requirement already satisfied: click>=8.1.3 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from Flask<3.1,>=1.0.4->dash) (8.1.7)
Requirement already satisfied: blinker>=1.6.2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from Flask<3.1,>=1.0.4->dash) (1.8.2)
Requirement already satisfied: contourpy>=1.0.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (1.3.0)
Requirement already satisfied: cycler>=0.10 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (4.54.1)
Requirement already satisfied: kiwisolver>=1.3.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (1.4.7)
Requirement already satisfied: packaging>=20.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (24.1)
Requirement already satisfied: pillow>=8 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (10.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (3.1.4)
Requirement already satisfied: python-dateutil>=2.7 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from matplotlib>=3.9->pymatviz) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pandas>=2.2->pandas[output-formatting]>=2.2->pymatviz) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pandas>=2.2->pandas[output-formatting]>=2.2->pymatviz) (2024.2)
Requirement already satisfied: tabulate>=0.9.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pandas[output-formatting]>=2.2->pymatviz) (0.9.0)
Requirement already satisfied: tenacity>=6.2.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from plotly>=5.23->pymatviz) (9.0.0)
Requirement already satisfied: joblib>=1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (1.4.2)
Requirement already satisfied: monty>=2024.7.29 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (2024.7.30)
Requirement already satisfied: networkx>=2.2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (3.3)
Requirement already satisfied: palettable>=3.3.3 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (3.3.3)
Requirement already satisfied: pybtex>=0.24.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (0.24.0)
Requirement already satisfied: ruamel.yaml>=0.17.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (0.18.6)
Requirement already satisfied: spglib>=2.5.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (2.5.0)
Requirement already satisfied: sympy>=1.2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (1.13.3)
Requirement already satisfied: tqdm>=4.60 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (4.66.5)
Requirement already satisfied: uncertainties>=3.1.4 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pymatgen>=2024.7.18->pymatviz) (3.2.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from requests->dash) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from requests->dash) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from requests->dash) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from requests->dash) (2024.8.30)
Requirement already satisfied: threadpoolctl>=3.1.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from scikit-learn>=1.5->pymatviz) (3.5.0)
Requirement already satisfied: MarkupSafe>=2.1.1 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from Werkzeug<3.1->dash) (2.1.5)
Requirement already satisfied: zipp>=3.20 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from importlib-metadata->dash) (3.20.2)
Requirement already satisfied: six>=1.7.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from retrying->dash) (1.16.0)
Requirement already satisfied: PyYAML>=3.01 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pybtex>=0.24.0->pymatgen>=2024.7.18->pymatviz) (6.0.2)
Requirement already satisfied: latexcodec>=1.0.4 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from pybtex>=0.24.0->pymatgen>=2024.7.18->pymatviz) (3.0.0)
Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from ruamel.yaml>=0.17.0->pymatgen>=2024.7.18->pymatviz) (0.2.8)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages (from sympy>=1.2->pymatgen>=2024.7.18->pymatviz) (1.3.0)
import dash
import pandas as pd
import plotly.graph_objects as go
import plotly.io as pio
from dash.dependencies import Input, Output
from mp_api.client import MPRester

from pymatviz import count_elements, ptable_heatmap, ptable_heatmap_plotly
from pymatviz.enums import Key


__author__ = "Janosh Riebesell"
__date__ = "2022-07-21"


# Interactive plotly figures don't show up on GitHub.
# https://github.com/plotly/plotly.py/issues/931
# change renderer from "svg" to "notebook" to get hover tooltips back
# (but blank plots on GitHub!)
pio.renderers.default = "png"
print(", ".join(MPRester().materials.summary.available_fields))
builder_meta, nsites, elements, nelements, composition, composition_reduced, formula_pretty, formula_anonymous, chemsys, volume, density, density_atomic, symmetry, property_name, material_id, deprecated, deprecation_reasons, last_updated, origins, warnings, structure, task_ids, uncorrected_energy_per_atom, energy_per_atom, formation_energy_per_atom, energy_above_hull, is_stable, equilibrium_reaction_energy_per_atom, decomposes_to, xas, grain_boundaries, band_gap, cbm, vbm, efermi, is_gap_direct, is_metal, es_source_calc_id, bandstructure, dos, dos_energy_up, dos_energy_down, is_magnetic, ordering, total_magnetization, total_magnetization_normalized_vol, total_magnetization_normalized_formula_units, num_magnetic_sites, num_unique_magnetic_sites, types_of_magnetic_species, bulk_modulus, shear_modulus, universal_anisotropy, homogeneous_poisson, e_total, e_ionic, e_electronic, n, e_ij_max, weighted_surface_energy_EV_PER_ANG2, weighted_surface_energy, weighted_work_function, surface_anisotropy, shape_factor, has_reconstructed, possible_species, has_props, theoretical, database_IDs
# set environment variable "MG_API_KEY"
with MPRester(use_document_model=False) as mpr:
    mp_data = mpr.materials.summary.search(
        # num_elements=(None, 4),  # 4 or less elements
        fields=[Key.mat_id, Key.formula_pretty, "nelements"]
    )
Retrieving SummaryDoc documents:   0%|          | 0/153235 [00:00<?, ?it/s]
df_mp = pd.DataFrame(map(dict, mp_data)).set_index("material_id")
df_mp.head()
nelements formula_pretty
material_id
mp-676011 1 Si
mp-1244924 1 Ti
mp-1244964 1 C
mp-1245266 1 Zn
mp-1244971 1 Si
# uncomment line to cache large MP data
%store df_mp

# uncomment line to load cached MP data from disk
# %store -r df_mp
Stored 'df_mp' (DataFrame)
elem_counts_by_arity = {
    label: count_elements(
        df_mp.query(f"nelements == {idx}")[Key.formula_pretty], fill_value=0
    )
    for idx, label in enumerate(["unary", "binary", "ternary", "quaternary"], 1)
}

compound_counts_by_arity = {
    key: (df_mp.nelements == idx).sum()
    for idx, key in enumerate(elem_counts_by_arity, 1)
}
for arity_label, elem_counts in elem_counts_by_arity.items():
    fig = ptable_heatmap(
        elem_counts, log=True, value_kwargs={"fontsize": 12}, return_type="figure"
    )
    n_compounds = compound_counts_by_arity[arity_label]
    fig.suptitle(
        f"Element distribution of {n_compounds:,} {arity_label} compounds in "
        "Materials Project",
        fontsize=16,
        fontweight="bold",
    )
/Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages/pymatviz/ptable/ptable_matplotlib.py:248: UserWarning:

Elements dropped due to close to zero value.

/Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages/pymatviz/ptable/ptable_matplotlib.py:248: UserWarning:

Elements dropped due to close to zero value.

/Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages/pymatviz/ptable/ptable_matplotlib.py:248: UserWarning:

Elements dropped due to close to zero value.

/Users/yang/developer/pymatviz/venv/lib/python3.12/site-packages/pymatviz/ptable/ptable_matplotlib.py:248: UserWarning:

Elements dropped due to close to zero value.

No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
arity_figs = {}
for arity_label, elem_counts in elem_counts_by_arity.items():
    fig = ptable_heatmap_plotly(
        elem_counts,
        hover_props=["atomic_number", "type"],
        heat_mode="percent",
    )
    n_compounds = compound_counts_by_arity[arity_label]

    title = (
        f"<b>Element distribution of {n_compounds:,} <i>{arity_label}</i> compounds<br>"
        "in Materials Project</b>"
    )
    fig.layout.title = dict(text=title, x=0.45, y=0.93)
    arity_figs[arity_label] = fig
    # fig.show()  # uncomment to show plotly figures
app = dash.Dash(prevent_initial_callbacks=True)

graph = dash.dcc.Graph(figure=fig, id="ptable-heatmap", responsive=True)
dropdown = dash.dcc.Dropdown(
    id="arity-dropdown",
    options=[
        dict(label=arity_label, value=arity_label)
        for arity_label in elem_counts_by_arity
    ],
    style=dict(width="15em", position="absolute", top="15%", left="30%"),
    value="unary",
    placeholder="Select arity",
)
main_layout = dash.html.Div([graph, dropdown], style=dict(fontFamily="sans-serif"))
app.layout = main_layout


@app.callback(Output(graph.id, "figure"), Input(dropdown.id, "value"))
def update_figure(dropdown_value: str) -> go.Figure:
    """Update figure based on dropdown value."""
    return arity_figs[dropdown_value]


app.run(debug=True, mode="inline")