Source code for matador.plotting.ir_plotting

""" This submodule implements functions useful for plotting
the results of infrared and Raman spectroscopy calculations.

"""

import numpy as np
from matador.scrapers import phonon2dict
from matador.plotting.plotting import plotting_function
from matador.utils.chem_utils import INVERSE_CM_TO_EV


[docs]@plotting_function def plot_ir_spectrum(seed, bin_width=1.0, ax=None, show=True, **kwargs): """This function plots the IR/Raman spectrum found in the given .phonon file. Parameters: seed (str): the filename to scrape and plot. Keyword arguments: bin_width (float): the bin width for the IR plot. ax (matplotlib.axes.Axes): an existing axis on which to plot. show (bool): whether or not to display the plot in an X window Raises: RuntimeError: if unable to scrape IR data. Returns: matplotlib.axes.Axes: matplotlib axis with plotted data. """ import matplotlib.pyplot as plt if ax is None: fig, ax_ir = plt.subplots(figsize=kwargs.get("figsize")) else: ax_ir = ax ir_data, s = phonon2dict(seed) if not s or "infrared_intensity" not in ir_data: raise RuntimeError("Error scraping file: no IR intensities. {}".format(ir_data)) wavenumbers = ir_data["eigenvalues_q"] / INVERSE_CM_TO_EV plotting_raman = "raman_intensity" in ir_data max_wavenumber = np.max(wavenumbers) bins = np.linspace( 0, 1.2 * max_wavenumber, num=int((1 / bin_width) * 1.2 * max_wavenumber) ) ir_spectrum, bin_edges = np.histogram( wavenumbers, bins=bins, weights=ir_data["infrared_intensity"], density=True ) # normalize so the highest peak is at 1 ir_spectrum /= np.max(ir_spectrum) if plotting_raman: raman_spectrum, _ = np.histogram( wavenumbers, bins=bins, weights=ir_data["raman_intensity"], density=True ) raman_spectrum /= np.max(raman_spectrum) # get bin centres bins = 0.5 * (bin_edges[1:] + bin_edges[:-1]) ax_ir.plot(bins, ir_spectrum, color="#EE3425") ax_ir.set_xlabel("Wavenumber (cm$^{-1}$)") ax_ir.set_ylabel("Relative IR intensity", color="#EE3425") plt.gca().invert_yaxis() plt.gca().invert_xaxis() ir_max = np.max(ir_spectrum) ax_ir.set_ylim(2.1 * ir_max, -ir_max * 0.05) ax_ir.set_yticks(np.linspace(0, 1, 6)) if plotting_raman: ax_raman = ax_ir.twinx() raman_max = np.max(raman_spectrum) ax_raman.set_yticks(np.linspace(0, 1, 6)) ax_raman.set_ylim(-raman_max * 0.05, 2.1 * raman_max) ax_raman.plot(bins, raman_spectrum, color="#236DE8") ax_raman.set_ylabel("Relative Raman activity", color="#236DE8") plt.title(seed) if any([kwargs.get("pdf"), kwargs.get("svg"), kwargs.get("png")]): filename = seed.split("/")[-1].replace(".phonon", "") + "_ir" if kwargs.get("pdf"): plt.savefig( "{}.pdf".format(filename), bbox_inches="tight", transparent=True ) if kwargs.get("svg"): plt.savefig( "{}.svg".format(filename), bbox_inches="tight", transparent=True ) if kwargs.get("png"): plt.savefig( "{}.png".format(filename), bbox_inches="tight", transparent=True ) elif show: plt.show() return ax