""" 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