Exercise 3: Visualizing Training Data#

You’ll need to run the Unpack.ipynb notebook before this one!

Setup#

from pyiron import Project
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
plt.rc('figure', figsize=(16,8))
plt.rc('font', size=18)
pr = Project('training')
pr.job_table()
id status chemicalformula job subjob projectpath project timestart timestop totalcputime computer hamilton hamversion parentid masterid
2 17168587 finished None full /full /cmmc/u/ zora/pyiron/projects/2022/POTENTIALS/TutorialNotebooks/workshop_preparation/introduction/training/ 2022-06-03 00:02:34.816533 None None zora@cmti001#1 TrainingContainer 0.4 None None
0 17168588 finished None basic /basic /cmmc/u/ zora/pyiron/projects/2022/POTENTIALS/TutorialNotebooks/workshop_preparation/introduction/training/ 2022-06-03 00:02:47.281055 None None zora@cmti001#1 TrainingContainer 0.4 None None
1 17168589 finished None Al_basic_atomicrex /Al_basic_atomicrex /cmmc/u/ zora/pyiron/projects/2022/POTENTIALS/TutorialNotebooks/workshop_preparation/introduction/training/ 2022-06-03 00:02:48.226369 None None zora@cmti001#1 TrainingContainer 0.4 None None

Loading Container#

container = pr.load('basic')

Some Predefined Plots#

Cell Information#

container.plot.cell();
../_images/ex_03_visualizing_training_data_11_0.png

Cell Symmetries#

container.plot.spacegroups();
../_images/ex_03_visualizing_training_data_13_0.png

E-V Curves#

container.plot.energy_volume();
../_images/ex_03_visualizing_training_data_15_0.png

Custom Plots from Data#

df = container.to_pandas()

E-V by Concentration#

df['concentration'] = df.atoms.map(lambda s: (s.get_chemical_symbols()=='Li').mean())
df['energy_atom'] = (df.energy / df.number_of_atoms)
df['volume_atom'] = df.atoms.map(lambda s: s.get_volume(per_atom=True))
sns.scatterplot(
    data=df,
    x='volume_atom',
    y='energy_atom',
    hue='concentration'
)
plt.xlabel(r'Atomic Volume [$\mathrm{\AA}^3$/atom')
plt.ylabel(r'Atomic Energy [eV/atom]')
plt.legend(title='Li')
<matplotlib.legend.Legend at 0x1502c1833a60>
../_images/ex_03_visualizing_training_data_22_1.png

Convex Hull#

First find the equilibrium energy at the terminal concentrations.

e_min_al = df.query('concentration == 0').energy_atom.min()
e_min_li = df.query('concentration == 1').energy_atom.min()
print(e_min_al, e_min_li)
-3.4827513025 -1.757035875

Next calculate the deviation to the “ideal” mixing enthalpy

\[ e(c_\mathrm{Li}) = e_\mathrm{Al} + c_\mathrm{Li} (e_\mathrm{Li} - e_\mathrm{Al}) \]

and call that the energy excess, where \(e\) are the per atom equilibrium energies of the pure phases.

df['energy_atom_excess'] = df.energy_atom - df.concentration * (e_min_li - e_min_al) - e_min_al
sns.lineplot(data=df,
             marker='o',
             x='concentration', y='energy_atom_excess',
             estimator=np.min)
plt.scatter(df.concentration, df.energy_atom_excess, marker='.')
plt.ylim(df.energy_atom_excess.min() * 1.2, .4)
plt.xlabel('Li concentration')
plt.ylabel('Excess Energy [eV/atom]')
Text(0, 0.5, 'Excess Energy [eV/atom]')
../_images/ex_03_visualizing_training_data_28_1.png

Extra Credit#

  1. Plot the energy against smallest nearest neighbor distance in a structure. You can get the neighbor information with the get_neighbor method on a structure.