From 45215b28d761c3e6a82be3a455457a8e794b92de Mon Sep 17 00:00:00 2001 From: Aritra Sinha Date: Sat, 4 Mar 2023 20:39:23 +0530 Subject: [PATCH 1/5] ENH: Add time range to different plots --- hnn_core/viz.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/hnn_core/viz.py b/hnn_core/viz.py index 7b896f9b8..58634a652 100644 --- a/hnn_core/viz.py +++ b/hnn_core/viz.py @@ -482,7 +482,8 @@ def plot_spikes_hist(cell_response, trial_idx=None, ax=None, spike_types=None, return ax.get_figure() -def plot_spikes_raster(cell_response, trial_idx=None, ax=None, show=True): +def plot_spikes_raster(cell_response, trial_idx=None, tmin=None, tmax=None, + ax=None, show=True): """Plot the aggregate spiking activity according to cell type. Parameters @@ -491,6 +492,10 @@ def plot_spikes_raster(cell_response, trial_idx=None, ax=None, show=True): The CellResponse object from net.cell_response trial_idx : int | list of int | None Index of trials to be plotted. If None, all trials plotted + tmin : float or None + Start time of plot in milliseconds. If None, plot entire simulation. + tmax : float or None + End time of plot in milliseconds. If None, plot entire simulation. ax : instance of matplotlib axis | None An axis object from matplotlib. If None, a new figure is created. show : bool @@ -538,6 +543,7 @@ def plot_spikes_raster(cell_response, trial_idx=None, ax=None, show=True): cell_type_times, cell_type_ypos = [], [] for gid in cell_type_gids: gid_time = spike_times[spike_gids == gid] + _, gid_time = _get_plot_data_trange(gid_time, gid_time, tmin, tmax) cell_type_times.append(gid_time) cell_type_ypos.append(ypos) ypos = ypos - 1 @@ -1179,8 +1185,8 @@ def _onclick(event): return ax.get_figure() -def plot_laminar_csd(times, data, contact_labels, ax=None, colorbar=True, - show=True): +def plot_laminar_csd(times, data, contact_labels, tmin=None, tmax=None, + ax=None, colorbar=True, show=True): """Plot laminar current source density (CSD) estimation from LFP array. Parameters @@ -1189,6 +1195,9 @@ def plot_laminar_csd(times, data, contact_labels, ax=None, colorbar=True, Sampling times (in ms). data : array-like, shape (n_channels, n_times) CSD data, channels x time. + tmin : float | None + Start time of plot in milliseconds. If None, plot entire simulation. + tmax : float | None ax : instance of matplotlib figure | None The matplotlib axis. colorbar : bool @@ -1207,7 +1216,9 @@ def plot_laminar_csd(times, data, contact_labels, ax=None, colorbar=True, import matplotlib.pyplot as plt if ax is None: _, ax = plt.subplots(1, 1, constrained_layout=True) - + times, data = _get_plot_data_trange(times, data, tmin, tmax) + _, contact_labels = _get_plot_data_trange( + times, contact_labels, tmin, tmax) im = ax.pcolormesh(times, contact_labels, np.array(data), cmap="jet_r", shading='auto') ax.set_title("CSD") From a821c26914309240859faf04d3c00105e1c98441 Mon Sep 17 00:00:00 2001 From: Tianqi Cheng Date: Wed, 25 Oct 2023 14:15:39 -0400 Subject: [PATCH 2/5] set_tstop_oct25 --- hnn_core/dipole.py | 11 +++-------- hnn_core/extracellular.py | 14 +++++--------- hnn_core/viz.py | 37 ++++++++++++++++--------------------- 3 files changed, 24 insertions(+), 38 deletions(-) diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index 28fe515a4..ffa6d9018 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -467,16 +467,11 @@ def savgol_filter(self, h_freq): self.sfreq) return self - def plot(self, tmin=None, tmax=None, layer='agg', decim=None, ax=None, - color='k', show=True): + def plot(self, layer='agg', decim=None, ax=None, color='k', show=True): """Simple layer-specific plot function. Parameters ---------- - tmin : float or None - Start time of plot (in ms). If None, plot entire simulation. - tmax : float or None - End time of plot (in ms). If None, plot entire simulation. layer : str The layer to plot. Can be one of 'agg', 'L2', and 'L5' decimate : int @@ -493,8 +488,8 @@ def plot(self, tmin=None, tmax=None, layer='agg', decim=None, ax=None, fig : instance of plt.fig The matplotlib figure handle. """ - return plot_dipole(self, tmin=tmin, tmax=tmax, ax=ax, layer=layer, - decim=decim, color=color, show=show) + return plot_dipole(self, ax=ax, layer=layer, decim=decim, color=color, + show=show) def plot_psd(self, fmin=0, fmax=None, tmin=None, tmax=None, layer='agg', color=None, label=None, ax=None, show=True): diff --git a/hnn_core/extracellular.py b/hnn_core/extracellular.py index 607a07310..ab5bf9944 100644 --- a/hnn_core/extracellular.py +++ b/hnn_core/extracellular.py @@ -421,9 +421,9 @@ def smooth(self, window_len): return self - def plot_lfp(self, *, trial_no=None, contact_no=None, tmin=None, tmax=None, - ax=None, decim=None, color='cividis', voltage_offset=50, - voltage_scalebar=200, show=True): + def plot_lfp(self, *, trial_no=None, contact_no=None, ax=None, decim=None, + color='cividis', voltage_offset=50, voltage_scalebar=200, + show=True): """Plot laminar local field potential time series. One plot is created for each trial. Multiple trials can be overlaid @@ -435,11 +435,6 @@ def plot_lfp(self, *, trial_no=None, contact_no=None, tmin=None, tmax=None, Trial number(s) to plot contact_no : int | list of int | slice Electrode contact number(s) to plot - tmin : float | None - Start time of plot in milliseconds. If None, plot entire - simulation. - tmax : float | None - End time of plot in milliseconds. If None, plot entire simulation. ax : instance of matplotlib figure | None The matplotlib axis decim : int | list of int | None (default) @@ -486,7 +481,7 @@ def plot_lfp(self, *, trial_no=None, contact_no=None, tmin=None, tmax=None, for trial_data in plot_data: fig = plot_laminar_lfp( - self.times, trial_data, tmin=tmin, tmax=tmax, ax=ax, + self.times, trial_data, ax=ax, decim=decim, color=color, voltage_offset=voltage_offset, voltage_scalebar=voltage_scalebar, @@ -534,6 +529,7 @@ class _ExtracellularArrayBuilder(object): The instance of :class:`hnn_core.extracellular.ExtracellularArray` to build in NEURON-Python """ + def __init__(self, array): self.array = array self.n_contacts = array.n_contacts diff --git a/hnn_core/viz.py b/hnn_core/viz.py index 58634a652..175b48cbc 100644 --- a/hnn_core/viz.py +++ b/hnn_core/viz.py @@ -78,9 +78,9 @@ def plt_show(show=True, fig=None, **kwargs): (fig or plt).show(**kwargs) -def plot_laminar_lfp(times, data, contact_labels, tmin=None, tmax=None, - ax=None, decim=None, color='cividis', - voltage_offset=50, voltage_scalebar=200, show=True): +def plot_laminar_lfp(times, data, contact_labels, ax=None, decim=None, + color='cividis', voltage_offset=50, voltage_scalebar=200, + show=True): """Plot laminar extracellular electrode array voltage time series. Parameters @@ -89,10 +89,6 @@ def plot_laminar_lfp(times, data, contact_labels, tmin=None, tmax=None, Sampling times (in ms). data : Two-dimensional Numpy array The extracellular voltages as an (n_contacts, n_times) array. - tmin : float | None - Start time of plot in milliseconds. If None, plot entire simulation. - tmax : float | None - End time of plot in milliseconds. If None, plot entire simulation. ax : instance of matplotlib figure | None The matplotlib axis decim : int | list of int | None (default) @@ -168,11 +164,11 @@ def plot_laminar_lfp(times, data, contact_labels, tmin=None, tmax=None, trace_offsets = np.arange(n_offsets)[:, np.newaxis] * voltage_offset for contact_no, trace in enumerate(np.atleast_2d(data)): - plot_data, plot_times = _get_plot_data_trange(times, trace, tmin, tmax) + plot_data = trace + plot_times = times if decim is not None: - plot_data, plot_times = _decimate_plot_data(decim, plot_data, - plot_times) + plot_data, plot_times = _decimate_plot_data(decim, trace, times) if isinstance(color, np.ndarray): col = color[contact_no] @@ -182,6 +178,7 @@ def plot_laminar_lfp(times, data, contact_labels, tmin=None, tmax=None, col = color ax.plot(plot_times, plot_data + trace_offsets[contact_no], label=f'C{contact_no}', color=col) + ax.set_xlim(right=plot_times[-1]) if voltage_offset is not None: ax.set_ylim(-voltage_offset, n_offsets * voltage_offset) @@ -220,7 +217,7 @@ def plot_laminar_lfp(times, data, contact_labels, tmin=None, tmax=None, return ax.get_figure() -def plot_dipole(dpl, tmin=None, tmax=None, ax=None, layer='agg', decim=None, +def plot_dipole(dpl, ax=None, layer='agg', decim=None, color='k', label="average", average=False, show=True): """Simple layer-specific plot function. @@ -228,10 +225,6 @@ def plot_dipole(dpl, tmin=None, tmax=None, ax=None, layer='agg', decim=None, ---------- dpl : instance of Dipole | list of Dipole instances The Dipole object. - tmin : float or None - Start time of plot in milliseconds. If None, plot entire simulation. - tmax : float or None - End time of plot in milliseconds. If None, plot entire simulation. ax : instance of matplotlib figure | None The matplotlib axis layer : str @@ -288,11 +281,11 @@ def plot_dipole(dpl, tmin=None, tmax=None, ax=None, layer='agg', decim=None, if layer in dpl_trial.data.keys(): # extract scaled data and times - data, times = _get_plot_data_trange(dpl_trial.times, - dpl_trial.data[layer], - tmin, tmax) + data = dpl_trial.data[layer] + times = dpl_trial.times if decim is not None: - data, times = _decimate_plot_data(decim, data, times) + data, times = _decimate_plot_data( + decim, dpl_trial.data[layer], dpl_trial.times) if idx == len(dpl) - 1 and average: # the average dpl ax.plot(times, data, color=color, label=label, lw=1.5) @@ -300,7 +293,7 @@ def plot_dipole(dpl, tmin=None, tmax=None, ax=None, layer='agg', decim=None, alpha = 0.5 if average else 1. ax.plot(times, data, color=_lighten_color(color, 0.5), alpha=alpha, lw=1.) - + ax.set_xlim(right=dpl_trial.times[-1]) if average: ax.legend() @@ -477,6 +470,7 @@ def plot_spikes_hist(cell_response, trial_idx=None, ax=None, spike_types=None, ax.set_ylabel("Counts") ax.legend() + ax.set_xlim(right=cell_response.times[-1]) plt_show(show) return ax.get_figure() @@ -558,7 +552,7 @@ def plot_spikes_raster(cell_response, trial_idx=None, tmin=None, tmax=None, ax.set_facecolor('k') ax.set_xlabel('Time (ms)') ax.get_yaxis().set_visible(False) - ax.set_xlim(left=0) + ax.set_xlim(left=0, right=cell_response.times[-1]) plt_show(show) return ax.get_figure() @@ -1229,6 +1223,7 @@ def plot_laminar_csd(times, data, contact_labels, tmin=None, tmax=None, ax.set_xlabel('Time (ms)') ax.set_ylabel('Electrode depth') + ax.set_xlim(right=times[-1]) plt.tight_layout() plt_show(show) From a997e702f3755ffdadc737561b67252ebcfe309b Mon Sep 17 00:00:00 2001 From: tianqi-cheng <113143982+tianqi-cheng@users.noreply.github.com> Date: Wed, 1 Nov 2023 14:39:59 -0400 Subject: [PATCH 3/5] Update hnn_core/viz.py Co-authored-by: Ryan Thorpe --- hnn_core/viz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hnn_core/viz.py b/hnn_core/viz.py index 175b48cbc..8b0f04c92 100644 --- a/hnn_core/viz.py +++ b/hnn_core/viz.py @@ -178,7 +178,7 @@ def plot_laminar_lfp(times, data, contact_labels, ax=None, decim=None, col = color ax.plot(plot_times, plot_data + trace_offsets[contact_no], label=f'C{contact_no}', color=col) - ax.set_xlim(right=plot_times[-1]) + ax.set_xlim(right=times[-1]) if voltage_offset is not None: ax.set_ylim(-voltage_offset, n_offsets * voltage_offset) From 464a706e6b4018ecdb51f9e0a0cf51aa4209fb1b Mon Sep 17 00:00:00 2001 From: Tianqi Cheng Date: Wed, 1 Nov 2023 14:52:57 -0400 Subject: [PATCH 4/5] update_nov1 --- hnn_core/viz.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/hnn_core/viz.py b/hnn_core/viz.py index 8b0f04c92..4328af560 100644 --- a/hnn_core/viz.py +++ b/hnn_core/viz.py @@ -476,7 +476,7 @@ def plot_spikes_hist(cell_response, trial_idx=None, ax=None, spike_types=None, return ax.get_figure() -def plot_spikes_raster(cell_response, trial_idx=None, tmin=None, tmax=None, +def plot_spikes_raster(cell_response, trial_idx=None, ax=None, show=True): """Plot the aggregate spiking activity according to cell type. @@ -486,10 +486,6 @@ def plot_spikes_raster(cell_response, trial_idx=None, tmin=None, tmax=None, The CellResponse object from net.cell_response trial_idx : int | list of int | None Index of trials to be plotted. If None, all trials plotted - tmin : float or None - Start time of plot in milliseconds. If None, plot entire simulation. - tmax : float or None - End time of plot in milliseconds. If None, plot entire simulation. ax : instance of matplotlib axis | None An axis object from matplotlib. If None, a new figure is created. show : bool @@ -537,7 +533,9 @@ def plot_spikes_raster(cell_response, trial_idx=None, tmin=None, tmax=None, cell_type_times, cell_type_ypos = [], [] for gid in cell_type_gids: gid_time = spike_times[spike_gids == gid] - _, gid_time = _get_plot_data_trange(gid_time, gid_time, tmin, tmax) + _, gid_time = _get_plot_data_trange( + gid_time, gid_time, cell_response.times[0], + cell_response.times[-1]) cell_type_times.append(gid_time) cell_type_ypos.append(ypos) ypos = ypos - 1 @@ -1179,7 +1177,7 @@ def _onclick(event): return ax.get_figure() -def plot_laminar_csd(times, data, contact_labels, tmin=None, tmax=None, +def plot_laminar_csd(times, data, contact_labels, ax=None, colorbar=True, show=True): """Plot laminar current source density (CSD) estimation from LFP array. @@ -1189,9 +1187,6 @@ def plot_laminar_csd(times, data, contact_labels, tmin=None, tmax=None, Sampling times (in ms). data : array-like, shape (n_channels, n_times) CSD data, channels x time. - tmin : float | None - Start time of plot in milliseconds. If None, plot entire simulation. - tmax : float | None ax : instance of matplotlib figure | None The matplotlib axis. colorbar : bool @@ -1210,9 +1205,9 @@ def plot_laminar_csd(times, data, contact_labels, tmin=None, tmax=None, import matplotlib.pyplot as plt if ax is None: _, ax = plt.subplots(1, 1, constrained_layout=True) - times, data = _get_plot_data_trange(times, data, tmin, tmax) + times, data = _get_plot_data_trange(times, data, times[0], times[-1]) _, contact_labels = _get_plot_data_trange( - times, contact_labels, tmin, tmax) + times, contact_labels, times[0], times[-1]) im = ax.pcolormesh(times, contact_labels, np.array(data), cmap="jet_r", shading='auto') ax.set_title("CSD") From d2c5c8c506dcbde33856f0fa3519674ab4a391b3 Mon Sep 17 00:00:00 2001 From: tianqi-cheng <113143982+tianqi-cheng@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:02:56 -0500 Subject: [PATCH 5/5] Update hnn_core/viz.py Co-authored-by: Ryan Thorpe --- hnn_core/viz.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hnn_core/viz.py b/hnn_core/viz.py index 4328af560..9d0a61747 100644 --- a/hnn_core/viz.py +++ b/hnn_core/viz.py @@ -284,8 +284,7 @@ def plot_dipole(dpl, ax=None, layer='agg', decim=None, data = dpl_trial.data[layer] times = dpl_trial.times if decim is not None: - data, times = _decimate_plot_data( - decim, dpl_trial.data[layer], dpl_trial.times) + data, times = _decimate_plot_data(decim, data, times) if idx == len(dpl) - 1 and average: # the average dpl ax.plot(times, data, color=color, label=label, lw=1.5)