Source code for pyglotaran_extras.plotting.plot_concentrations

"""Module containing concentration plot functionality."""

from __future__ import annotations

from typing import TYPE_CHECKING

from pyglotaran_extras.plotting.style import PlotStyle
from pyglotaran_extras.plotting.utils import MinorSymLogLocator
from pyglotaran_extras.plotting.utils import add_cycler_if_not_none
from pyglotaran_extras.plotting.utils import get_shifted_traces

if TYPE_CHECKING:
    import xarray as xr
    from cycler import Cycler
    from matplotlib.axis import Axis


[docs] def plot_concentrations( res: xr.Dataset, ax: Axis, center_λ: float | None, linlog: bool = False, linthresh: float = 1, linscale: float = 1, main_irf_nr: int = 0, cycler: Cycler | None = PlotStyle().cycler, title: str = "Concentrations", ) -> None: """Plot traces on the given axis ``ax``. Parameters ---------- res : xr.Dataset Result dataset from a pyglotaran optimization. ax : Axis Axis to plot the traces on center_λ : float | None Center wavelength (λ in nm) linlog : bool Whether to use 'symlog' scale or not. Defaults to False. linthresh : float A single float which defines the range (-x, x), within which the plot is linear. This avoids having the plot go to infinity around zero. Defaults to 1. linscale : float This allows the linear range (-linthresh to linthresh) to be stretched relative to the logarithmic range. Its value is the number of decades to use for each half of the linear range. For example, when linscale == 1.0 (the default), the space used for the positive and negative halves of the linear range will be equal to one decade in the logarithmic range. Defaults to 1. main_irf_nr : int Index of the main ``irf`` component when using an ``irf`` parametrized with multiple peaks. Defaults to 0. cycler : Cycler | None Plot style cycler to use. Defaults to PlotStyle().data_cycler_solid. title : str Title used for the plot axis. Defaults to "Concentrations". See Also -------- get_shifted_traces """ add_cycler_if_not_none(ax, cycler) traces = get_shifted_traces(res, center_λ, main_irf_nr) if "spectral" in traces.coords: traces.sel(spectral=center_λ, method="nearest").plot.line(x="time", ax=ax) else: traces.plot.line(x="time", ax=ax) ax.set_title(title) if linlog: ax.set_xscale("symlog", linthresh=linthresh, linscale=linscale) ax.xaxis.set_minor_locator(MinorSymLogLocator(linthresh))