diff --git a/src/pymatgen/analysis/phase_diagram.py b/src/pymatgen/analysis/phase_diagram.py index c5632f82812..57c751bad70 100644 --- a/src/pymatgen/analysis/phase_diagram.py +++ b/src/pymatgen/analysis/phase_diagram.py @@ -2781,18 +2781,36 @@ def _create_plotly_fill(self): ys.append(y) zs.append(z) - traces += [ - go.Mesh3d( - x=xs, - y=ys, - z=zs, - opacity=0.05, - alphahull=-1, - flatshading=True, - hoverinfo="skip", - color=next(fillcolors), - ) - ] + if _idx == 1: + traces += [ + go.Mesh3d( + x=xs, + y=ys, + z=zs, + opacity=0.05, + alphahull=-1, + flatshading=True, + hoverinfo="skip", + color=next(fillcolors), + legendgroup="facets", + showlegend=True, + name="Hull Surfaces (toggle to access points easier)", + ) + ] + else: + traces += [ + go.Mesh3d( + x=xs, + y=ys, + z=zs, + opacity=0.05, + alphahull=-1, + flatshading=True, + hoverinfo="skip", + color=next(fillcolors), + legendgroup="facets", + ) + ] return traces @@ -2974,7 +2992,6 @@ def get_marker_props(coords, entries): x, y, z, texts, energies, uncertainties = [], [], [], [], [], [] is_stable = [entry in self._pd.stable_entries for entry in entries] - for coord, entry, stable in zip(coords, entries, is_stable): energy = round(self._pd.get_form_energy_per_atom(entry), 3) @@ -2988,13 +3005,12 @@ def get_marker_props(coords, entries): formula = comp.reduced_formula clean_formula = htmlify(formula) - label = f"{clean_formula} ({entry_id})
{energy} eV/atom" - + label = f"{clean_formula} ({entry_id})
Formation energy: {energy} eV/atom
" if not stable: e_above_hull = round(self._pd.get_e_above_hull(entry), 3) if e_above_hull > self.show_unstable: continue - label += f" ({e_above_hull:+} eV/atom)" + label += f" Energy Above Hull: ({e_above_hull:+} eV/atom)" energies.append(e_above_hull) else: uncertainty = 0 @@ -3002,23 +3018,39 @@ def get_marker_props(coords, entries): if hasattr(entry, "correction_uncertainty_per_atom") and label_uncertainties: uncertainty = round(entry.correction_uncertainty_per_atom, 4) label += f"
(Error: +/- {uncertainty} eV/atom)" - uncertainties.append(uncertainty) energies.append(energy) - texts.append(label) - if self._dim == 3 and self.ternary_style == "2d": - for el, axis in zip(self._pd.elements, [x, y, z]): - axis.append(entry.composition[el]) + label += "
" + total_sum_el = sum(entry.composition[el] for el, _axis in zip(self._pd.elements, range(self._dim))) + for el, axis in zip(self._pd.elements, range(self._dim)): + _cartesian_positions = [x, y, z] + _cartesian_positions[axis].append(entry.composition[el]) + label += f"
{el}: {round(entry.composition[el]/total_sum_el, 6)}" + elif self._dim == 3 and self.ternary_style == "3d": + x.append(coord[0]) + y.append(coord[1]) + z.append(energy) + + label += "
" + total_sum_el = sum(entry.composition[el] for el, _axis in zip(self._pd.elements, range(self._dim))) + for el, _axis in zip(self._pd.elements, range(self._dim)): + label += f"
{el}: {round(entry.composition[el]/total_sum_el, 6)}" + elif self._dim == 4: + x.append(coord[0]) + y.append(coord[1]) + z.append(coord[2]) + + label += "
" + total_sum_el = sum(entry.composition[el] for el, _axis in zip(self._pd.elements, range(self._dim))) + for el, _axis in zip(self._pd.elements, range(self._dim)): + label += f"
{el}: {round(entry.composition[el]/total_sum_el, 6)}" else: x.append(coord[0]) y.append(coord[1]) - if self._dim == 3: - z.append(energy) - elif self._dim == 4: - z.append(coord[2]) + texts.append(label) return {"x": x, "y": y, "z": z, "texts": texts, "energies": energies, "uncertainties": uncertainties} diff --git a/src/pymatgen/apps/battery/plotter.py b/src/pymatgen/apps/battery/plotter.py index f8725ef25e6..e73576f27d8 100644 --- a/src/pymatgen/apps/battery/plotter.py +++ b/src/pymatgen/apps/battery/plotter.py @@ -133,7 +133,7 @@ def get_plotly_figure( **kwargs: passed to plotly.graph_objects.Layout """ font_dict = font_dict or {"family": "Arial", "size": 24, "color": "#000000"} - hover_temp = "Voltage : %{y:.2f} V" + hover_temp = "Voltage (V): %{y:.2f}
x: %{x:.3f}" data = [] working_ion_symbols = set()