Source code for piel.visual.plot.signals.time.overlay
from typing import Any
from piel.types import MultiTimeSignalData, Unit
import numpy as np
import matplotlib.pyplot as plt
from piel.visual.plot.position import create_axes_per_figure
from piel.visual.plot.core import save
import logging
logger = logging.getLogger(__name__)
[docs]
def plot_multi_data_time_signal_equivalent(
multi_signal: MultiTimeSignalData,
fig: Any = None,
axs: Any = None,
subplots_kwargs: dict = None,
xlabel: str | Unit = None,
ylabel: str | Unit = None,
**kwargs,
):
"""
Plots all rising edge signals on the same figure with a shared x-axis.
Args:
multi_signal (List[TimeSignalData]): List of rising edge signals.
subplots_kwargs (dict): Keyword arguments to pass to create_axes_per_figure.
Returns:
None
"""
x_correction = 1
y_correction = 1
if not multi_signal:
raise ValueError("The multi_signal list is empty.")
if xlabel is None:
xlabel = r"Time $s$"
elif isinstance(xlabel, str):
pass
elif isinstance(xlabel, Unit):
x_correction = xlabel.base
logger.warning(
f"Data correction of 1/{x_correction} from unit definition {xlabel} will be applied on x-axis"
)
xlabel = xlabel.label
if ylabel is None:
ylabel = r"Voltage $V$"
elif isinstance(ylabel, str):
pass
elif isinstance(ylabel, Unit):
y_correction = ylabel.base
logger.warning(
f"Data correction of 1/{y_correction} from unit definition {ylabel} will be applied on y-axis."
)
ylabel = ylabel.label
if subplots_kwargs is None:
subplots_kwargs = {}
if (fig is None) or (axs is None):
fig, axs = create_axes_per_figure(rows=1, columns=1, **subplots_kwargs)
for signal in multi_signal:
if (len(signal.time_s) == 0) or (signal.time_s is None):
raise ValueError(f"Signal '{signal.data_name}' has an empty time_s array.")
time = np.array(signal.time_s) / x_correction
data = np.array(signal.data) / y_correction
axs[0].plot(
time,
data,
label=signal.data_name,
color=plt.rcParams["axes.prop_cycle"].by_key()["color"][0],
)
fig.supxlabel(xlabel)
fig.supylabel(ylabel)
save(fig, **kwargs)
return fig, axs