Module libwwz.plot_methods
This module provides functions for plotting the outcomes of wwz.py. It focuses on making proper grids for pcolormesh.
Expand source code
"""
This module provides functions for plotting the outcomes of wwz.py. It focuses on making proper grids for pcolormesh.
"""
import matplotlib.ticker as ticker
import matplotlib.axes as axes
import numpy as np
def make_linear_freq_plot_grid(freq_mat: np.ndarray) -> np.ndarray:
"""
Used for linear method.
Takes the FREQ output from wwz.py and creates a grid for pcolormesh.
:param freq_mat: FREQ output from wwz.py
:return: freq_grid: np.ndarray with the boundaries for the FREQ output
"""
# Get the array of center frequencies from the freq_mat
freq_centers = freq_mat[0, :]
# Get the freq_steps by subtracting the first two freq_centers
freq_step = freq_centers[1] - freq_centers[0]
# Subtract half of the freq_step from the freq_centers to get lower bound
freq_lows = freq_centers - freq_step / 2
# Append the high frequency bound to get all the boundaries
freq_highest = freq_centers.max() + freq_step / 2
freq_bounds = np.append(freq_lows, freq_highest)
# Tile the freq_bounds to create a grid
freq_grid = np.tile(freq_bounds, (freq_mat.shape[0] + 1, 1))
return freq_grid
def make_octave_freq_plot_grid(freq_mat: np.ndarray, band_order: float, log_scale_base: float) -> np.ndarray:
"""
Used for octave method.
Takes the FREQ output from wwz.py and creates a grid for pcolormesh
:param freq_mat: FREQ output from wwz.py
:param band_order: octave band order (N => 1) *Recommend N = (1, 3, 6, 12, 24,...)
:param log_scale_base: logarithmic scale base to create the octaves
:return:req_grid: np.ndarray with the boundaries for the FREQ output
"""
# Get the array of the center frequencies from the freq_mat
freq_centers = freq_mat[0, :]
# Convert the center frequencies to low frequencies
freq_lows = freq_centers / log_scale_base**(1 / (2 * band_order))
# Append the high frequency at the end to get all the boundaries
freq_highest = freq_centers.max() * log_scale_base**(1 / (2 * band_order))
freq_bounds = np.append(freq_lows, freq_highest)
# Tile the freq_bounds to create a grid
freq_grid = np.tile(freq_bounds, (freq_mat.shape[0] + 1, 1))
return freq_grid
def make_tau_plot_grid(tau_mat: np.ndarray) -> np.ndarray:
"""
Used for both octave and linear.
Takes the TAU output from wwz.py and creates a grid for pcolormesh
:param tau_mat: TAU output from wwz.py
:return:
"""
# Get the tau values from tau_mat
taus = tau_mat[:, 0]
# Append one tau value for edge limit by adding the step to the largest tau
taus = np.append(taus, taus[-1] + taus[1] - taus[0])
# Tile the taus with an additional column to create grid that matches freq_grid
tau_grid = np.tile(taus, (tau_mat.shape[1] + 1, 1)).transpose()
return tau_grid
def linear_plotter(ax: axes, TAU: np.ndarray, FREQ: np.ndarray, DATA: np.ndarray):
"""
Creates a plot for the 'linear' method.
You can add titles after calling the plotter.
:param ax: axis from a matplotlib.pyplot.subplots() to plot the data
:param TAU: TAU output of the wwz.py (the time shifts)
:param FREQ: FREQ output of the wwz.py (the frequencies)
:param DATA: Desired data to be plotted
:return:
"""
# Create grid for pcolormesh boundaries
tau_grid = make_tau_plot_grid(TAU)
freq_grid = make_linear_freq_plot_grid(FREQ)
# Plot using subplots
im = ax.pcolormesh(tau_grid, freq_grid, DATA)
# Add color bar and fix y_ticks
ax.figure.colorbar(im, ax=ax)
ax.set_yticks(FREQ[0, :])
ax.get_yaxis().set_major_formatter(ticker.ScalarFormatter())
def octave_plotter(ax: axes, TAU: np.ndarray, FREQ: np.ndarray, DATA: np.ndarray,
band_order: float, log_scale_base: float, log_y_scale: bool = True):
"""
Creates a plot for the 'linear' method.
You can add titles after calling the plotter.
:param ax: axis from a matplotlib.pyplot.subplots() to plot the data
:param TAU: TAU output of the wwz.py (the time shifts)
:param FREQ: FREQ output of the wwz.py (the frequencies)
:param DATA: Desired data to be plotted
:param band_order: octave band order (N => 1) *Recommend N = (1, 3, 6, 12, 24,...)
:param log_scale_base: logarithmic scale base to create the octaves
:param log_y_scale: determines if the plot y_scale should be 'log' or not.
:return:
"""
# Create grid for pcolormesh boundaries
tau_grid = make_tau_plot_grid(TAU)
freq_grid = make_octave_freq_plot_grid(FREQ, band_order, log_scale_base)
# Plot using subplots
im = ax.pcolormesh(tau_grid, freq_grid, DATA)
# Add color bar, fix y_scale, and fix y_ticks
ax.figure.colorbar(im, ax=ax)
if log_y_scale is True:
ax.set_yscale('log', base=log_scale_base)
ax.set_yticks(FREQ[0, :])
ax.get_yaxis().set_major_formatter(ticker.ScalarFormatter())
Functions
def linear_plotter(ax:
, TAU: numpy.ndarray, FREQ: numpy.ndarray, DATA: numpy.ndarray) -
Creates a plot for the 'linear' method. You can add titles after calling the plotter. :param ax: axis from a matplotlib.pyplot.subplots() to plot the data :param TAU: TAU output of the wwz.py (the time shifts) :param FREQ: FREQ output of the wwz.py (the frequencies) :param DATA: Desired data to be plotted :return:
Expand source code
def linear_plotter(ax: axes, TAU: np.ndarray, FREQ: np.ndarray, DATA: np.ndarray): """ Creates a plot for the 'linear' method. You can add titles after calling the plotter. :param ax: axis from a matplotlib.pyplot.subplots() to plot the data :param TAU: TAU output of the wwz.py (the time shifts) :param FREQ: FREQ output of the wwz.py (the frequencies) :param DATA: Desired data to be plotted :return: """ # Create grid for pcolormesh boundaries tau_grid = make_tau_plot_grid(TAU) freq_grid = make_linear_freq_plot_grid(FREQ) # Plot using subplots im = ax.pcolormesh(tau_grid, freq_grid, DATA) # Add color bar and fix y_ticks ax.figure.colorbar(im, ax=ax) ax.set_yticks(FREQ[0, :]) ax.get_yaxis().set_major_formatter(ticker.ScalarFormatter())
def make_linear_freq_plot_grid(freq_mat: numpy.ndarray) ‑> numpy.ndarray
-
Used for linear method. Takes the FREQ output from wwz.py and creates a grid for pcolormesh. :param freq_mat: FREQ output from wwz.py :return: freq_grid: np.ndarray with the boundaries for the FREQ output
Expand source code
def make_linear_freq_plot_grid(freq_mat: np.ndarray) -> np.ndarray: """ Used for linear method. Takes the FREQ output from wwz.py and creates a grid for pcolormesh. :param freq_mat: FREQ output from wwz.py :return: freq_grid: np.ndarray with the boundaries for the FREQ output """ # Get the array of center frequencies from the freq_mat freq_centers = freq_mat[0, :] # Get the freq_steps by subtracting the first two freq_centers freq_step = freq_centers[1] - freq_centers[0] # Subtract half of the freq_step from the freq_centers to get lower bound freq_lows = freq_centers - freq_step / 2 # Append the high frequency bound to get all the boundaries freq_highest = freq_centers.max() + freq_step / 2 freq_bounds = np.append(freq_lows, freq_highest) # Tile the freq_bounds to create a grid freq_grid = np.tile(freq_bounds, (freq_mat.shape[0] + 1, 1)) return freq_grid
def make_octave_freq_plot_grid(freq_mat: numpy.ndarray, band_order: float, log_scale_base: float) ‑> numpy.ndarray
-
Used for octave method. Takes the FREQ output from wwz.py and creates a grid for pcolormesh :param freq_mat: FREQ output from wwz.py :param band_order: octave band order (N => 1) *Recommend N = (1, 3, 6, 12, 24,…) :param log_scale_base: logarithmic scale base to create the octaves :return:req_grid: np.ndarray with the boundaries for the FREQ output
Expand source code
def make_octave_freq_plot_grid(freq_mat: np.ndarray, band_order: float, log_scale_base: float) -> np.ndarray: """ Used for octave method. Takes the FREQ output from wwz.py and creates a grid for pcolormesh :param freq_mat: FREQ output from wwz.py :param band_order: octave band order (N => 1) *Recommend N = (1, 3, 6, 12, 24,...) :param log_scale_base: logarithmic scale base to create the octaves :return:req_grid: np.ndarray with the boundaries for the FREQ output """ # Get the array of the center frequencies from the freq_mat freq_centers = freq_mat[0, :] # Convert the center frequencies to low frequencies freq_lows = freq_centers / log_scale_base**(1 / (2 * band_order)) # Append the high frequency at the end to get all the boundaries freq_highest = freq_centers.max() * log_scale_base**(1 / (2 * band_order)) freq_bounds = np.append(freq_lows, freq_highest) # Tile the freq_bounds to create a grid freq_grid = np.tile(freq_bounds, (freq_mat.shape[0] + 1, 1)) return freq_grid
def make_tau_plot_grid(tau_mat: numpy.ndarray) ‑> numpy.ndarray
-
Used for both octave and linear. Takes the TAU output from wwz.py and creates a grid for pcolormesh :param tau_mat: TAU output from wwz.py :return:
Expand source code
def make_tau_plot_grid(tau_mat: np.ndarray) -> np.ndarray: """ Used for both octave and linear. Takes the TAU output from wwz.py and creates a grid for pcolormesh :param tau_mat: TAU output from wwz.py :return: """ # Get the tau values from tau_mat taus = tau_mat[:, 0] # Append one tau value for edge limit by adding the step to the largest tau taus = np.append(taus, taus[-1] + taus[1] - taus[0]) # Tile the taus with an additional column to create grid that matches freq_grid tau_grid = np.tile(taus, (tau_mat.shape[1] + 1, 1)).transpose() return tau_grid
def octave_plotter(ax:
, TAU: numpy.ndarray, FREQ: numpy.ndarray, DATA: numpy.ndarray, band_order: float, log_scale_base: float, log_y_scale: bool = True) -
Creates a plot for the 'linear' method. You can add titles after calling the plotter. :param ax: axis from a matplotlib.pyplot.subplots() to plot the data :param TAU: TAU output of the wwz.py (the time shifts) :param FREQ: FREQ output of the wwz.py (the frequencies) :param DATA: Desired data to be plotted :param band_order: octave band order (N => 1) *Recommend N = (1, 3, 6, 12, 24,…) :param log_scale_base: logarithmic scale base to create the octaves :param log_y_scale: determines if the plot y_scale should be 'log' or not. :return:
Expand source code
def octave_plotter(ax: axes, TAU: np.ndarray, FREQ: np.ndarray, DATA: np.ndarray, band_order: float, log_scale_base: float, log_y_scale: bool = True): """ Creates a plot for the 'linear' method. You can add titles after calling the plotter. :param ax: axis from a matplotlib.pyplot.subplots() to plot the data :param TAU: TAU output of the wwz.py (the time shifts) :param FREQ: FREQ output of the wwz.py (the frequencies) :param DATA: Desired data to be plotted :param band_order: octave band order (N => 1) *Recommend N = (1, 3, 6, 12, 24,...) :param log_scale_base: logarithmic scale base to create the octaves :param log_y_scale: determines if the plot y_scale should be 'log' or not. :return: """ # Create grid for pcolormesh boundaries tau_grid = make_tau_plot_grid(TAU) freq_grid = make_octave_freq_plot_grid(FREQ, band_order, log_scale_base) # Plot using subplots im = ax.pcolormesh(tau_grid, freq_grid, DATA) # Add color bar, fix y_scale, and fix y_ticks ax.figure.colorbar(im, ax=ax) if log_y_scale is True: ax.set_yscale('log', base=log_scale_base) ax.set_yticks(FREQ[0, :]) ax.get_yaxis().set_major_formatter(ticker.ScalarFormatter())