Source code for pyrtid.plot.plt_obs_vs_simu
from typing import Optional
import numpy as np
from matplotlib.axes import Axes
from pyrtid.utils import NDArrayFloat
[docs]def plot_observed_vs_simulated(
ax: Axes,
obs_vector: NDArrayFloat,
pred_vector: Optional[NDArrayFloat] = None,
pred_vector_initial: Optional[NDArrayFloat] = None,
units: Optional[str] = None,
) -> None:
"""
Plot observed vs simulated data.
Parameters
----------
ax: Axes
The ax on which to plot the data.
obs_vector : NDArrayFloat
The vector of observed data.
pred_vector : Optional[NDArrayFloat], optional
The vector of predicted data. The default is None.
pred_vector_initial : Optional[NDArrayFloat], optional
An optional additional vector of 'initial' predicted data.
It allows to see the difference between before and after an inversion.
The default is None.
units : Optional[str], optional
The unit of the data (for display). The default is None.
"""
ax.set_title("obs. vs simul.", fontweight="bold")
if pred_vector_initial is None and pred_vector is None:
raise ValueError(
'At least one for "pred_vector_initial" or "pred_vector" should be given !'
)
VERY_LARGE_NB = 1.0e40
minobs = VERY_LARGE_NB
maxobs = -VERY_LARGE_NB
if pred_vector_initial is not None:
ax.plot(
obs_vector, pred_vector_initial, ".", c="r", zorder=1, label="initial guess"
)
minobs: float = min(
minobs, float(np.min(np.vstack((obs_vector, pred_vector_initial.ravel()))))
)
maxobs: float = max(
maxobs, float(np.max(np.vstack((obs_vector, pred_vector_initial.ravel()))))
)
if pred_vector is not None:
ax.plot(obs_vector, pred_vector, ".", c="b", zorder=2, label="post-inversion")
minobs: float = min(
minobs, float(np.min(np.vstack((obs_vector, pred_vector.ravel()))))
)
maxobs: float = max(
maxobs, float(np.max(np.vstack((obs_vector, pred_vector.ravel()))))
)
ax.set_aspect("equal", adjustable="box")
# ax.axis('square')
_suffix = ""
if units is not None:
_suffix = f" [{units}]"
ax.set_xlabel("observed" + _suffix, fontweight="bold")
ax.set_ylabel("simulated" + _suffix, fontweight="bold")
margin: float = 0.05 * np.abs(
maxobs - minobs
) # 5% on each side for a nicer display
ax.set_xlim((minobs - margin, maxobs + margin))
ax.set_ylim(*ax.get_xlim())
ax.plot(
np.linspace(ax.get_xlim()[0], ax.get_xlim()[1], 20),
np.linspace(ax.get_ylim()[0], ax.get_ylim()[1], 20),
"k-",
)