Source code for viziphant.spike_train_synchrony

"""
Spike train synchrony plots
---------------------------

.. autosummary::
    :toctree: toctree/spike_train_synchrony

    plot_spike_contrast

"""
# Copyright 2017-2023 by the Viziphant team, see `doc/authors.rst`.
# License: Modified BSD, see LICENSE.txt for details.

import matplotlib.pyplot as plt
import numpy as np

from viziphant.rasterplot import rasterplot


[docs] def plot_spike_contrast(trace, spiketrains=None, title=None, lw=1.0, xscale='log', **kwargs): """ Plot Spike-contrast synchrony measure :cite:`Ciba18_136`. Parameters ---------- trace : SpikeContrastTrace The trace output from :func:`elephant.spike_train_synchrony.spike_contrast` function. spiketrains : list of neo.SpikeTrain or None Input spike trains, optional. If provided, the raster plot will be shown at the bottom. Default: None title : str or None. The plot title. If None, an automatic description will be set. Default: None lw : float, optional The curves line width. Default: 1.0 xscale : str, optional X axis scale. Default: 'log' **kwargs Additional arguments, passed in :func:`viziphant.rasterplot.rasterplot` Returns ------- axes : matplotlib.Axes.axes Examples -------- Spike-contrast synchrony of homogenous Poisson processes. .. plot:: :include-source: import numpy as np import quantities as pq from elephant.spike_train_generation import homogeneous_poisson_process from elephant.spike_train_synchrony import spike_contrast import viziphant np.random.seed(24) spiketrains = [homogeneous_poisson_process(rate=20 * pq.Hz, t_stop=10 * pq.s) for _ in range(10)] synchrony, trace = spike_contrast(spiketrains, return_trace=True) viziphant.spike_train_synchrony.plot_spike_contrast(trace, spiketrains=spiketrains, c='gray', s=1) plt.show() """ nrows = 2 if spiketrains is not None else 1 fig, axes = plt.subplots(nrows=nrows) axes = np.atleast_1d(axes) units = trace.bin_size.units bin_sizes = trace.bin_size.magnitude axes[0].plot(bin_sizes, trace.contrast, lw=lw, label=r'Contrast($\Delta$)', linestyle='dashed', color='limegreen') axes[0].plot(bin_sizes, trace.active_spiketrains, lw=lw, label=r'ActiveST($\Delta$)', linestyle='dashdot', color='dodgerblue') axes[0].plot(bin_sizes, trace.synchrony, lw=lw, label=r'Synchrony($\Delta$)', color='black') bin_id_max = np.argmax(trace.synchrony) synchrony_loc = bin_sizes[bin_id_max], trace.synchrony[bin_id_max] axes[0].scatter(*synchrony_loc, s=20, c='red', marker='x') axes[0].annotate('S', synchrony_loc, color='red', va='bottom', ha='left') axes[0].legend() axes[0].set_xscale(xscale) axes[0].set_xlabel(fr"Bin size $\Delta$ ({units.dimensionality})") if title is None: title = "Spike-contrast synchrony measure" axes[0].set_title(title) if spiketrains is not None: rasterplot(spiketrains, axes=axes[1], **kwargs) axes[1].set_ylabel('neuron') axes[1].yaxis.set_label_coords(-0.01, 0.5) plt.tight_layout() return axes