Source code for wield.iirrational.plots.plot_residuals
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: © 2021 Massachusetts Institute of Technology.
# SPDX-FileCopyrightText: © 2021 Lee McCuller <mcculler@caltech.edu>
# NOTICE: authors should document their contributions in concisely in NOTICE
# with details inline in source files, comments, and docstrings.
"""
"""
import numpy as np
from matplotlib import gridspec
from ..utilities.mpl import generate_stacked_plot_ax
from .plot_augment import plot_augment_residuals
[docs]
def plot_residuals(
self,
fitter=None,
gs_base=gridspec.GridSpec(1, 1)[0],
fig=None,
ax_bunch=None,
xscale=None,
plot_now=True,
**kwargs
):
use_phase = True
if ax_bunch is None:
axB = generate_stacked_plot_ax(
[
("mag", True),
("phase", use_phase),
],
height_ratios=dict(
mag=2,
),
heights_phys_in_default=1,
xscales="log",
gs_base=gs_base,
fig=fig,
ax_bunch=ax_bunch,
)
else:
axB = ax_bunch
fit_list = []
axB.plot_fit = plot_augment_residuals(
self, ax_mag=axB.mag, ax_phase=axB.phase, fit_list=fit_list, **kwargs
)
axB.mag.set_ylabel("Residuals Magnitude")
if axB.phase:
axB.phase.set_ylabel("Residuals Phase [deg]")
axB.ax_bottom.set_xlabel("Frequency [Hz]")
if fitter is not None and plot_now:
axB.plot_fit(fitter)
def finalize():
min_lims = []
max_lims = []
for fitB in fit_list:
min_err_lim = min(
fitB.median_res_lim,
fitB.min_res_err_lim,
max(fitB.min_res_err_lim / 30, fitB.min_res_err_lim * 1),
)
min_lims.append(min_err_lim)
max_err_lim = max(
fitB.median_res_lim,
fitB.max_res_err_lim,
min(fitB.max_res_err_lim * 30, fitB.max_res_err_lim / 1),
)
max_lims.append(max_err_lim)
axB.mag.set_ylim(np.min(min_lims), max(max_lims))
scales = []
mins = []
minsNZ = []
maxs = []
for fitB in fit_list:
scales.append(fitB.scale_log)
mins.append(fitB.minF_Hz)
minsNZ.append(fitB.minF_HzNZ)
maxs.append(fitB.maxF_Hz)
if xscale is None:
if np.count_nonzero(scales) / len(scales) > 0.5:
final_xscale = "log_zoom"
else:
final_xscale = "linear"
else:
final_xscale = xscale
if final_xscale in ["log", "log_zoom"]:
xmin = np.min(minsNZ)
else:
xmin = np.min(mins)
xmax = np.max(maxs)
axB.ax_bottom.set_xscale(final_xscale)
axB.ax_bottom.set_xlim(xmin, xmax)
for subax in axB.ax_list_0:
subax.set_xscale(final_xscale)
subax.set_xlim(xmin, xmax)
axB.mag.legend(ncol=2, fontsize=8, loc="best")
axB.finalizers.append(finalize)
return axB