Source code for phys2cvr.viz

#!/usr/bin/env python3
"""
Plotting module for phys2cvr.

Attributes
----------
FIGSIZE : tuple
    Figure size
SET_DPI : int
    DPI of the figure
LGR :
    Logger
"""

import logging

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import zscore as zs

SET_DPI = 100
FIGSIZE = (18, 10)

LGR = logging.getLogger(__name__)
LGR.setLevel(logging.INFO)


def _time_axis(array, freq=None):
    """
    Prepare time axis for the plots.

    Parameters
    ----------
    freq : None, optional
        Sampling frequency of array. If specified, plot against time.

    Returns
    -------
    time_axis : np.ndarray
        Time in seconds if freq is not None or number of samples if it is.
    """
    if freq is not None:
        # Preparing time axis for plots
        return np.linspace(0, (len(array) - 1) / freq, len(array))
    else:
        return np.arange(0, array.size)


[docs] def plot_two_timeseries( ts1, ts2, outname, ts1_name=None, ts2_name=None, freq=None, zscore=False ): """ Plot two timeseries. Parameters ---------- ts1 : np.ndarray-like First timeseries to be plotted. ts2 : np.ndarray-like Second tiemseries to be plotted. outname : str or path Filename (and path to) to save the image. ts1_name : str or None, optional Name of the first timeseries, for legend and title. ts2_name : str or None, optional Name of the second timeseries, for legend and title. freq : None, optional Frequency of Xcorr samples. If specified, it's used to plot against time. zscore : bool, optional If True, zscore timeseries before plot. Default is False. """ ts1 = zs(ts1) if zscore else ts1 ts2 = zs(ts2) if zscore else ts2 plt.figure(figsize=FIGSIZE, dpi=SET_DPI) time_axis = _time_axis(ts1, freq) plt.plot(time_axis, ts1, '-') time_axis = _time_axis(ts2, freq) plt.plot(time_axis, ts2, '-') plt.title(f'{ts1_name} vs {ts2_name}') plt.legend([ts1_name, ts2_name]) plt.tight_layout() plt.savefig(outname, dpi=SET_DPI) plt.close()
[docs] def plot_xcorr(xcorr, outprefix, freq=None): """ Plot Cross Correlation max and abs max values. Parameters ---------- xcorr : np.ndarray-like Cross correlation array. outprefix : str or path Prefix of filename (and path to) to save the image. freq : None, optional Frequency of Xcorr samples. If specified, it's used to plot against time. """ time_axis = _time_axis(xcorr, freq) plt.figure(figsize=FIGSIZE, dpi=SET_DPI) plt.plot(time_axis, xcorr) plt.plot(time_axis[xcorr.argmax()], xcorr[xcorr.argmax()], 'd') plt.plot(time_axis[np.abs(xcorr).argmax()], xcorr[np.abs(xcorr).argmax()], 'x') plt.legend(['Cross correlation value', 'Max Xcorr', 'Max absolute Xcorr']) plt.title('Cross correlation and optimal shift') plt.tight_layout() plt.savefig(f'{outprefix}_optshift.png', dpi=SET_DPI) plt.close()
""" Copyright 2021-2026, Stefano Moia & phys2cvr contributors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """