Source code for wield.control.fitting.SISO.plots.rel_comparison
#!/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.np import logspaced
from ..utilities.mpl import generate_stacked_plot_ax
[docs]
def plot_rel_comparison(
self,
fitter,
fitter_ref,
N_points=1000,
gs_base=gridspec.GridSpec(1, 1)[0],
fig=None,
ax_bunch=None,
xscale=None,
):
if ax_bunch is None:
axB = generate_stacked_plot_ax(
[
("rel", True),
],
height_ratios=dict(
mag=1,
),
heights_phys_in_default=1,
xscales="log",
gs_base=gs_base,
fig=fig,
ax_bunch=ax_bunch,
)
else:
axB = ax_bunch
axB.phase = axB.rel.twinx()
f_min = np.max(fitter.F_Hz)
f = np.sort(
np.concatenate(
[
fitter.F_Hz,
np.linspace(f_min, fitter.F_nyquist_Hz, N_points // 2),
logspaced(f_min, fitter.F_nyquist_Hz, N_points // 4),
]
)
)
f = f[f > 0]
h = fitter.xfer_eval(f)
h_ref = fitter_ref.xfer_eval(f)
rel = h / h_ref
mline = axB.rel.semilogx(
f, 20 * np.log10(abs(rel)), color="black", label="rel mag [db]"
)
pline = axB.phase.semilogx(
f,
np.angle(rel),
label="fit phase [rad]",
color="purple",
)
axB.rel.legend(handles=[mline[0], pline[0]], ncol=2, fontsize=8, loc="lower right")
axB.rel.set_xlabel("Frequency [Hz]")
axB.rel.set_ylabel("DB difference")
axB.phase.set_ylabel("Rad Difference")
axB.finalize()
return axB