Source code for pyprocar.scripts.scriptBandsDosplot

__author__ = "Pedram Tavadze and Logan Lang"
__maintainer__ = "Pedram Tavadze and Logan Lang"
__email__ = "petavazohi@mail.wvu.edu, lllang@mix.wvu.edu"
__date__ = "March 31, 2020"

import inspect
from typing import List

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

from pyprocar.utils.info import orbital_names

from ..io import qe, vasp
from ..plotter import DOSPlot, EBSPlot
from ..utils import welcome
from ..utils.defaults import settings
from .scriptBandsplot import bandsplot
from .scriptDosplot import dosplot

bands_settings = {
    key: value
    for key, value in zip(
        inspect.getfullargspec(bandsplot).args,
        inspect.getfullargspec(bandsplot).defaults,
    )
}
dos_settings = {
    key: value
    for key, value in zip(
        inspect.getfullargspec(dosplot).args, inspect.getfullargspec(dosplot).defaults
    )
}


[docs] def bandsdosplot( bands_settings: dict = bands_settings, dos_settings: dict = dos_settings, dos_limit: List[int] = None, elimit: List[int] = None, k_limit=None, grid: bool = False, code: str = "vasp", lobster: bool = False, savefig: str = None, title: str = None, title_fontsize: float = 16, discontinuities=None, draw_fermi: bool = True, plot_color_bar: bool = True, repair: bool = True, show: bool = True, dpi: int = 300, figsize=(16.5, 5.5), **kwargs, ): """A function to plot the band structure and the density of states in the same plot Parameters ---------- bands_settings : dict, optional A dictionary containing the keyword arguments from bandsplot, by default bands_settings dos_settings : dict, optional A dictionary containing the keyword arguments from dosplot, by default dos_settings dos_limit : List[int], optional The dos window to plot, by default None elimit : List[int], optional The energy window to plot, by default None k_limit : _type_, optional The kpath points to plot, by default None grid : bool, optional Boolean to plot a grid, by default False code : str, optional The code to use, by default "vasp" lobster : bool, optional Boolean if this is a lobster calculation, by default False savefig : str, optional The filename to to save the plot as., by default None title : str, optional String for the title name, by default None title_fontsize : float, optional Float for the title size, by default 16 discontinuities : _type_, optional _description_, by default None draw_fermi : bool, optional Boolean to plot the fermi level, by default True plot_color_bar : bool, optional Boolean to plot the color bar, by default True repair : bool, optional Boolean to repair the PROCAR file, by default True show : bool, optional Boolean to show the plot, by default True """ welcome() # inital settings bands_settings["code"] = code dos_settings["code"] = code dos_settings["orientation"] = "vertical" bands_settings["show"] = False dos_settings["show"] = False # parses old elements # bands_settings, dos_settings = parse_kwargs(kwargs,bands_settings, dos_settings) # plots bandsplot and dosplot ebs_plot_fig, ebs_plot_ax = bandsplot(**bands_settings) edos_plot_fig, edos_plot_ax = dosplot(**dos_settings) plt.close("all") fig = plt.figure(figsize=figsize, clear=True, dpi=dpi) # combines bandsplot and dos plot ax_ebs, ax_dos = combine_axes( ebs_plot_fig, edos_plot_fig, fig, plot_color_bar=plot_color_bar ) # axes opitions if elimit is not None: ax_dos.set_ylim(elimit) ax_ebs.set_ylim(elimit) if dos_limit is not None: ax_dos.set_xlim(dos_limit) if k_limit is not None: ax_ebs.set_xlim(k_limit) if grid: ax_ebs.grid() ax_dos.grid() if draw_fermi: ax_ebs.axhline( y=0, color=settings.dos.fermi_color, linestyle=settings.dos.fermi_linestyle, linewidth=settings.dos.fermi_linewidth, ) ax_dos.axhline( y=0, color=settings.dos.fermi_color, linestyle=settings.dos.fermi_linestyle, linewidth=settings.dos.fermi_linewidth, ) if title is not None: fig.suptitle(title, title_fontsize=title_fontsize) if savefig: fig.set_size_inches(figsize) plt.savefig(savefig, dpi=dpi) plt.clf() if show: plt.show() return fig, ax_ebs, ax_dos
def combine_axes(fig_ebs, fig_dos, fig, plot_color_bar=True): # Changes link of axes to old to new figure. Then adds the axes to the current figure ax_ebs = fig_ebs.axes[0] ax_dos = fig_dos.axes[0] ax_ebs.figure = fig fig.axes.append(ax_ebs) fig.add_axes(ax_ebs) ax_dos.figure = fig fig.axes.append(ax_dos) fig.add_axes(ax_dos) ax_color_bar = None if len(fig_ebs.axes) != 1 and plot_color_bar: ax_color_bar = fig_ebs.axes[1] ax_color_bar.figure = fig fig.axes.append(ax_color_bar) fig.add_axes(ax_color_bar) elif len(fig_dos.axes) != 1 and plot_color_bar: ax_color_bar = fig_dos.axes[1] ax_color_bar.figure = fig fig.axes.append(ax_color_bar) fig.add_axes(ax_color_bar) # Changeing location of dos plot dos_position = list(fig.axes[1].get_position().bounds) ebs_position = list(fig.axes[0].get_position().bounds) dos_position[0] = ebs_position[0] + ebs_position[3] + 0.025 fig.axes[1].set_position(dos_position) # Formating dos plot to be comatible with band structure plot fig.axes[1].axes.set_ylabel("") fig.axes[1].axes.set_yticklabels([]) fig.axes[1].sharey(fig.axes[0]) fig.axes[1].axes.get_yaxis().set_visible(False) # Handles existing colorbars if ax_color_bar is not None: dos_position = list(fig.axes[1].get_position().bounds) color_bar_position = list(fig.axes[2].get_position().bounds) color_bar_position[0] = dos_position[0] + dos_position[3] - 0.1 fig.axes[2].set_position(color_bar_position) return fig.axes[0], fig.axes[1] def parse_kwargs(kwargs, bands_settings, dos_settings): for key, value in kwargs.items(): if key == "dos_file": dos_settings["filename"] = value if key == "dos_dirname": dos_settings["dirname"] = value if key == "bands_dirname": bands_settings["dirname"] = value if key == "kpoints": bands_settings["kpoints"] = value if key == "bands_mode": bands_settings["mode"] = value if key == "dos_mode": dos_settings["mode"] = value if key == "dos_plot_total": dos_settings["plot_total"] = value if key == "fermi": bands_settings["fermi"] = value # if key is "mask": # bands_settings["mask"] = value # if key is "markersize": # bands_settings["maerkersize"] = value # if key is "marker": # bands_settings["marker"] = value if key == "atoms": bands_settings["atoms"] = value dos_settings["atoms"] = value if key == "orbitals": bands_settings["orbitals"] = value dos_settings["orbitals"] = value if key == "bands_spin": dos_settings["spins"] = value if key == "dos_spin": dos_settings["spins"] = value if key == "dos_labels": dos_settings["spin_labels"] = value if key == "dos_spin_colors": dos_settings["spin_colors"] = value if key == "dos_colors": dos_settings["colors"] = value if key == "dos_title": dos_settings["title"] = value if key == "items": bands_settings["items"] = value dos_settings["items"] = value if key == "dos_interpolation_factor": dos_settings["interpolation_factor"] = value if key == "vmin": bands_settings["vmin"] = value dos_settings["vmin"] = value if key == "vmax": bands_settings["vmax"] = value dos_settings["vmax"] = value if key == "cmap": dos_settings["cmap"] = value if key == "kdirect": bands_settings["kdirect"] = value return bands_settings, dos_settings