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