From 0ed74398f54c31c255d7ab7995e70341a1bf7778 Mon Sep 17 00:00:00 2001
From: ryanhammonds
Date: Fri, 5 Mar 2021 14:22:39 -0800
Subject: [PATCH 1/5] consolidate plotting to spectra funcs
---
examples/sims/plot_simulated_power_spectra.py | 6 +-
fooof/plts/__init__.py | 3 +-
fooof/plts/annotate.py | 24 ++---
fooof/plts/error.py | 4 +-
fooof/plts/fm.py | 14 +--
fooof/plts/spectra.py | 90 ++++---------------
fooof/tests/plts/test_spectra.py | 18 ++--
7 files changed, 47 insertions(+), 112 deletions(-)
diff --git a/examples/sims/plot_simulated_power_spectra.py b/examples/sims/plot_simulated_power_spectra.py
index ac915f218..f955ed8c8 100644
--- a/examples/sims/plot_simulated_power_spectra.py
+++ b/examples/sims/plot_simulated_power_spectra.py
@@ -11,7 +11,7 @@
from fooof.sim.gen import gen_power_spectrum, gen_group_power_spectra
# Import plotting functions
-from fooof.plts.spectra import plot_spectrum, plot_spectra
+from fooof.plts.spectra import plot_spectra
###################################################################################################
# Creating Simulated Power Spectra
@@ -53,7 +53,7 @@
###################################################################################################
# Plot the simulated power spectrum
-plot_spectrum(freqs, powers, log_freqs=True, log_powers=False)
+plot_spectra(freqs, powers, log_freqs=True, log_powers=False)
###################################################################################################
# Simulating With Different Parameters
@@ -100,7 +100,7 @@
###################################################################################################
# Plot the new simulated power spectrum
-plot_spectrum(freqs, powers, log_powers=True)
+plot_spectra(freqs, powers, log_powers=True)
###################################################################################################
# Simulating a Group of Power Spectra
diff --git a/fooof/plts/__init__.py b/fooof/plts/__init__.py
index 981ba12b4..95e05f403 100644
--- a/fooof/plts/__init__.py
+++ b/fooof/plts/__init__.py
@@ -1,3 +1,4 @@
"""Plots sub-module for FOOOF."""
-from .spectra import plot_spectrum, plot_spectra
+from .spectra import plot_spectra
+from .spectra import plot_spectra as plot_spectrum
diff --git a/fooof/plts/annotate.py b/fooof/plts/annotate.py
index d2d426358..e23f00401 100644
--- a/fooof/plts/annotate.py
+++ b/fooof/plts/annotate.py
@@ -8,7 +8,7 @@
from fooof.core.modutils import safe_import, check_dependency
from fooof.sim.gen import gen_aperiodic
from fooof.plts.utils import check_ax
-from fooof.plts.spectra import plot_spectrum
+from fooof.plts.spectra import plot_spectra
from fooof.plts.settings import PLT_FIGSIZES, PLT_COLORS
from fooof.plts.style import check_n_style, style_spectrum_plot
from fooof.analysis.periodic import get_band_peak_fm
@@ -46,14 +46,14 @@ def plot_annotated_peak_search(fm, plot_style=style_spectrum_plot):
# This forces the creation of a new plotting axes per iteration
ax = check_ax(None, PLT_FIGSIZES['spectral'])
- plot_spectrum(fm.freqs, flatspec, ax=ax, plot_style=None,
- label='Flattened Spectrum', color=PLT_COLORS['data'], linewidth=2.5)
- plot_spectrum(fm.freqs, [fm.peak_threshold * np.std(flatspec)]*len(fm.freqs),
- ax=ax, plot_style=None, label='Relative Threshold',
- color='orange', linewidth=2.5, linestyle='dashed')
- plot_spectrum(fm.freqs, [fm.min_peak_height]*len(fm.freqs),
- ax=ax, plot_style=None, label='Absolute Threshold',
- color='red', linewidth=2.5, linestyle='dashed')
+ plot_spectra(fm.freqs, flatspec, ax=ax, plot_style=None,
+ label='Flattened Spectrum', color=PLT_COLORS['data'], linewidth=2.5)
+ plot_spectra(fm.freqs, [fm.peak_threshold * np.std(flatspec)]*len(fm.freqs),
+ ax=ax, plot_style=None, label='Relative Threshold',
+ color='orange', linewidth=2.5, linestyle='dashed')
+ plot_spectra(fm.freqs, [fm.min_peak_height]*len(fm.freqs),
+ ax=ax, plot_style=None, label='Absolute Threshold',
+ color='red', linewidth=2.5, linestyle='dashed')
maxi = np.argmax(flatspec)
ax.plot(fm.freqs[maxi], flatspec[maxi], '.',
@@ -65,9 +65,9 @@ def plot_annotated_peak_search(fm, plot_style=style_spectrum_plot):
if ind < fm.n_peaks_:
gauss = gaussian_function(fm.freqs, *fm.gaussian_params_[ind, :])
- plot_spectrum(fm.freqs, gauss, ax=ax, plot_style=None,
- label='Gaussian Fit', color=PLT_COLORS['periodic'],
- linestyle=':', linewidth=3.0)
+ plot_spectra(fm.freqs, gauss, ax=ax, plot_style=None,
+ label='Gaussian Fit', color=PLT_COLORS['periodic'],
+ linestyle=':', linewidth=3.0)
flatspec = flatspec - gauss
diff --git a/fooof/plts/error.py b/fooof/plts/error.py
index c870900bc..c731c9236 100644
--- a/fooof/plts/error.py
+++ b/fooof/plts/error.py
@@ -3,7 +3,7 @@
import numpy as np
from fooof.core.modutils import safe_import, check_dependency
-from fooof.plts.spectra import plot_spectrum
+from fooof.plts.spectra import plot_spectra
from fooof.plts.settings import PLT_FIGSIZES
from fooof.plts.style import check_n_style, style_spectrum_plot
from fooof.plts.utils import check_ax
@@ -41,7 +41,7 @@ def plot_spectral_error(freqs, error, shade=None, log_freqs=False,
plt_freqs = np.log10(freqs) if log_freqs else freqs
- plot_spectrum(plt_freqs, error, plot_style=None, ax=ax, linewidth=3, **plot_kwargs)
+ plot_spectra(plt_freqs, error, plot_style=None, ax=ax, linewidth=3, **plot_kwargs)
if np.any(shade):
ax.fill_between(plt_freqs, error-shade, error+shade, alpha=0.25)
diff --git a/fooof/plts/fm.py b/fooof/plts/fm.py
index 2f8a100c0..f7ae0461a 100644
--- a/fooof/plts/fm.py
+++ b/fooof/plts/fm.py
@@ -13,7 +13,7 @@
from fooof.sim.gen import gen_periodic
from fooof.utils.data import trim_spectrum
from fooof.utils.params import compute_fwhm
-from fooof.plts.spectra import plot_spectrum
+from fooof.plts.spectra import plot_spectra
from fooof.plts.settings import PLT_FIGSIZES, PLT_COLORS
from fooof.plts.utils import check_ax, check_plot_kwargs
from fooof.plts.style import check_n_style, style_spectrum_plot
@@ -73,24 +73,24 @@ def plot_fm(fm, plot_peaks=None, plot_aperiodic=True, plt_log=False, add_legend=
data_kwargs = check_plot_kwargs(data_kwargs, \
{'color' : PLT_COLORS['data'], 'linewidth' : 2.0,
'label' : 'Original Spectrum' if add_legend else None})
- plot_spectrum(fm.freqs, fm.power_spectrum, log_freqs, log_powers,
- ax=ax, plot_style=None, **data_kwargs)
+ plot_spectra(fm.freqs, fm.power_spectrum, log_freqs, log_powers,
+ ax=ax, plot_style=None, **data_kwargs)
# Add the full model fit, and components (if requested)
if fm.has_model:
model_kwargs = check_plot_kwargs(model_kwargs, \
{'color' : PLT_COLORS['model'], 'linewidth' : 3.0, 'alpha' : 0.5,
'label' : 'Full Model Fit' if add_legend else None})
- plot_spectrum(fm.freqs, fm.fooofed_spectrum_, log_freqs, log_powers,
- ax=ax, plot_style=None, **model_kwargs)
+ plot_spectra(fm.freqs, fm.fooofed_spectrum_, log_freqs, log_powers,
+ ax=ax, plot_style=None, **model_kwargs)
# Plot the aperiodic component of the model fit
if plot_aperiodic:
aperiodic_kwargs = check_plot_kwargs(aperiodic_kwargs, \
{'color' : PLT_COLORS['aperiodic'], 'linewidth' : 3.0, 'alpha' : 0.5,
'linestyle' : 'dashed', 'label' : 'Aperiodic Fit' if add_legend else None})
- plot_spectrum(fm.freqs, fm._ap_fit, log_freqs, log_powers,
- ax=ax, plot_style=None, **aperiodic_kwargs)
+ plot_spectra(fm.freqs, fm._ap_fit, log_freqs, log_powers,
+ ax=ax, plot_style=None, **aperiodic_kwargs)
# Plot the periodic components of the model fit
if plot_peaks:
diff --git a/fooof/plts/spectra.py b/fooof/plts/spectra.py
index eaeafdbe7..12718528a 100644
--- a/fooof/plts/spectra.py
+++ b/fooof/plts/spectra.py
@@ -19,41 +19,6 @@
###################################################################################################
###################################################################################################
-@check_dependency(plt, 'matplotlib')
-def plot_spectrum(freqs, power_spectrum, log_freqs=False, log_powers=False,
- ax=None, plot_style=style_spectrum_plot, **plot_kwargs):
- """Plot a power spectrum.
-
- Parameters
- ----------
- freqs : 1d array
- Frequency values, to be plotted on the x-axis.
- power_spectrum : 1d array
- Power values, to be plotted on the y-axis.
- log_freqs : bool, optional, default: False
- Whether to plot the frequency axis in log spacing.
- log_powers : bool, optional, default: False
- Whether to plot the power axis in log spacing.
- ax : matplotlib.Axes, optional
- Figure axis upon which to plot.
- plot_style : callable, optional, default: style_spectrum_plot
- A function to call to apply styling & aesthetics to the plot.
- **plot_kwargs
- Keyword arguments to be passed to the plot call.
- """
-
- ax = check_ax(ax, plot_kwargs.pop('figsize', PLT_FIGSIZES['spectral']))
-
- # Set plot data & labels, logging if requested
- plt_freqs = np.log10(freqs) if log_freqs else freqs
- plt_powers = np.log10(power_spectrum) if log_powers else power_spectrum
-
- # Create the plot
- plot_kwargs = check_plot_kwargs(plot_kwargs, {'linewidth' : 2.0})
- ax.plot(plt_freqs, plt_powers, **plot_kwargs)
-
- check_n_style(plot_style, ax, log_freqs, log_powers)
-
@check_dependency(plt, 'matplotlib')
def plot_spectra(freqs, power_spectra, log_freqs=False, log_powers=False, labels=None,
@@ -82,51 +47,28 @@ def plot_spectra(freqs, power_spectra, log_freqs=False, log_powers=False, labels
ax = check_ax(ax, plot_kwargs.pop('figsize', PLT_FIGSIZES['spectral']))
- # Make inputs iterable if need to be passed multiple times to plot each spectrum
- freqs = repeat(freqs) if isinstance(freqs, np.ndarray) and freqs.ndim == 1 else freqs
- labels = repeat(labels) if not isinstance(labels, list) else labels
-
- for freq, power_spectrum, label in zip(freqs, power_spectra, labels):
- plot_spectrum(freq, power_spectrum, log_freqs, log_powers, label=label,
- plot_style=None, ax=ax, **plot_kwargs)
-
- check_n_style(plot_style, ax, log_freqs, log_powers)
-
+ # Create the plot
+ plot_kwargs = check_plot_kwargs(plot_kwargs, {'linewidth' : 2.0})
-@check_dependency(plt, 'matplotlib')
-def plot_spectrum_shading(freqs, power_spectrum, shades, shade_colors='r', add_center=False,
- ax=None, plot_style=style_spectrum_plot, **plot_kwargs):
- """Plot a power spectrum with a shaded frequency region (or regions).
+ # Make inputs iterable if need to be passed multiple times to plot each spectrum
+ plt_powers = np.reshape(power_spectra, (1, -1)) if np.ndim(power_spectra) == 1 else \
+ power_spectra
+ plt_freqs = repeat(freqs) if isinstance(freqs, np.ndarray) and freqs.ndim == 1 else freqs
- Parameters
- ----------
- freqs : 1d array
- Frequency values, to be plotted on the x-axis.
- power_spectrum : 1d array
- Power values, to be plotted on the y-axis.
- shades : list of [float, float] or list of list of [float, float]
- Shaded region(s) to add to plot, defined as [lower_bound, upper_bound].
- shade_colors : str or list of string
- Color(s) to plot shades.
- add_center : bool, optional, default: False
- Whether to add a line at the center point of the shaded regions.
- ax : matplotlib.Axes, optional
- Figure axes upon which to plot.
- plot_style : callable, optional, default: style_spectrum_plot
- A function to call to apply styling & aesthetics to the plot.
- **plot_kwargs
- Keyword arguments to be passed to the plot call.
- """
+ # Set labels
+ labels = plot_kwargs.pop('label') if 'label' in plot_kwargs.keys() and labels is None else labels
+ labels = repeat(labels) if not isinstance(labels, list) else labels
- ax = check_ax(ax, plot_kwargs.pop('figsize', PLT_FIGSIZES['spectral']))
+ # Plot
+ for freqs, powers, label in zip(plt_freqs, plt_powers, labels):
- plot_spectrum(freqs, power_spectrum, plot_style=None, ax=ax, **plot_kwargs)
+ # Set plot data & labels, logging if requested
+ freqs = np.log10(freqs) if log_freqs else freqs
+ powers = np.log10(powers) if log_powers else powers
- add_shades(ax, shades, shade_colors, add_center, plot_kwargs.get('log_freqs', False))
+ ax.plot(freqs, powers, label=label, **plot_kwargs)
- check_n_style(plot_style, ax,
- plot_kwargs.get('log_freqs', False),
- plot_kwargs.get('log_powers', False))
+ check_n_style(plot_style, ax, log_freqs, log_powers)
@check_dependency(plt, 'matplotlib')
diff --git a/fooof/tests/plts/test_spectra.py b/fooof/tests/plts/test_spectra.py
index 9abb95b2a..12025f18a 100644
--- a/fooof/tests/plts/test_spectra.py
+++ b/fooof/tests/plts/test_spectra.py
@@ -10,15 +10,10 @@
###################################################################################################
@plot_test
-def test_plot_spectrum(tfm, skip_if_no_mpl):
+def test_plot_spectra(tfm, tfg, skip_if_no_mpl):
- plot_spectrum(tfm.freqs, tfm.power_spectrum)
-
- # Test with logging both axes
- plot_spectrum(tfm.freqs, tfm.power_spectrum, True, True)
-
-@plot_test
-def test_plot_spectra(tfg, skip_if_no_mpl):
+ # Test with 1d inputs - 1d freq array and 1d power spectrum
+ plot_spectra(tfm.freqs, tfm.power_spectrum)
# Test with 1d inputs - 1d freq array and list of 1d power spectra
plot_spectra(tfg.freqs, [tfg.power_spectra[0, :], tfg.power_spectra[1, :]])
@@ -34,12 +29,9 @@ def test_plot_spectra(tfg, skip_if_no_mpl):
plot_spectra(tfg.freqs, [tfg.power_spectra[0, :], tfg.power_spectra[1, :]], labels=['A', 'B'])
@plot_test
-def test_plot_spectrum_shading(tfm, skip_if_no_mpl):
+def test_plot_spectra_shading(tfm, tfg, skip_if_no_mpl):
- plot_spectrum_shading(tfm.freqs, tfm.power_spectrum, shades=[8, 12], add_center=True)
-
-@plot_test
-def test_plot_spectra_shading(tfg, skip_if_no_mpl):
+ plot_spectra_shading(tfm.freqs, tfm.power_spectrum, shades=[8, 12], add_center=True)
plot_spectra_shading(tfg.freqs, [tfg.power_spectra[0, :], tfg.power_spectra[1, :]],
shades=[8, 12], add_center=True)
From 3541e51ad5f94f5e0d5b2dbe9cab115c1d627d5b Mon Sep 17 00:00:00 2001
From: ryanhammonds
Date: Fri, 5 Mar 2021 14:23:07 -0800
Subject: [PATCH 2/5] consolidate plotting to spectra funcs in docs
---
doc/api.rst | 2 --
examples/analyses/plot_mne_example.py | 10 +++----
examples/plots/plot_power_spectra.py | 13 ++++-----
motivations/measurements/plot_BandRatios.py | 8 +++---
tutorials/plot_01-ModelDescription.py | 6 ++--
tutorials/plot_03-FOOOFAlgorithm.py | 32 ++++++++++-----------
6 files changed, 34 insertions(+), 37 deletions(-)
diff --git a/doc/api.rst b/doc/api.rst
index d3aedc109..988ec3f16 100644
--- a/doc/api.rst
+++ b/doc/api.rst
@@ -247,7 +247,6 @@ Plots for visualizing power spectra.
.. autosummary::
:toctree: generated/
- plot_spectrum
plot_spectra
Plots for plotting power spectra with shaded regions.
@@ -257,7 +256,6 @@ Plots for plotting power spectra with shaded regions.
.. autosummary::
:toctree: generated/
- plot_spectrum_shading
plot_spectra_shading
Plot Model Properties & Parameters
diff --git a/examples/analyses/plot_mne_example.py b/examples/analyses/plot_mne_example.py
index 19a058a18..17ea559d8 100644
--- a/examples/analyses/plot_mne_example.py
+++ b/examples/analyses/plot_mne_example.py
@@ -32,7 +32,7 @@
from fooof import FOOOFGroup
from fooof.bands import Bands
from fooof.analysis import get_band_peak_fg
-from fooof.plts.spectra import plot_spectrum
+from fooof.plts.spectra import plot_spectra
###################################################################################################
# Load & Check MNE Data
@@ -284,10 +284,10 @@ def check_nans(data, nan_policy='zero'):
# Compare the power spectra between low and high exponent channels
fig, ax = plt.subplots(figsize=(8, 6))
-plot_spectrum(fg.freqs, fg.get_fooof(np.argmin(exps)).power_spectrum,
- ax=ax, label='Low Exponent')
-plot_spectrum(fg.freqs, fg.get_fooof(np.argmax(exps)).power_spectrum,
- ax=ax, label='High Exponent')
+plot_spectra(fg.freqs, fg.get_fooof(np.argmin(exps)).power_spectrum,
+ ax=ax, label='Low Exponent')
+plot_spectra(fg.freqs, fg.get_fooof(np.argmax(exps)).power_spectrum,
+ ax=ax, label='High Exponent')
###################################################################################################
# Conclusion
diff --git a/examples/plots/plot_power_spectra.py b/examples/plots/plot_power_spectra.py
index f994c16e1..df2bf30ef 100644
--- a/examples/plots/plot_power_spectra.py
+++ b/examples/plots/plot_power_spectra.py
@@ -11,8 +11,7 @@
import matplotlib.pyplot as plt
# Import plotting functions
-from fooof.plts.spectra import plot_spectrum, plot_spectra
-from fooof.plts.spectra import plot_spectrum_shading, plot_spectra_shading
+from fooof.plts.spectra import plot_spectra, plot_spectra_shading
# Import simulation utilities for creating test data
from fooof.sim.gen import gen_power_spectrum, gen_group_power_spectra
@@ -59,7 +58,7 @@
#
# First we will start with the core plotting function that plots an individual power spectrum.
#
-# The :func:`~.plot_spectrum` function takes in an array of frequency values and a 1d array of
+# The :func:`~.plot_spectra` function takes in an array of frequency values and a 1d array of
# of power values, and plots the corresponding power spectrum.
#
# This function, as all the functions in the plotting module, takes in optional inputs
@@ -70,7 +69,7 @@
###################################################################################################
# Create a spectrum plot with a single power spectrum
-plot_spectrum(freqs, powers1, log_powers=True)
+plot_spectra(freqs, powers1, log_powers=True)
###################################################################################################
# Plotting Multiple Power Spectra
@@ -97,7 +96,7 @@
# In some cases it may be useful to highlight or shade in particular frequency regions,
# for example, when examining power in particular frequency regions.
#
-# The :func:`~.plot_spectrum_shading` function takes in a power spectrum and one or more
+# The :func:`~.plot_spectra_shading` function takes in a power spectrum and one or more
# shaded regions, and plot the power spectrum with the indicated region shaded.
#
# The same can be done for multiple power spectra with :func:`~.plot_spectra_shading`.
@@ -110,7 +109,7 @@
###################################################################################################
# Plot a single power spectrum, with a shaded region covering alpha
-plot_spectrum_shading(freqs, powers1, [8, 12], log_powers=True)
+plot_spectra_shading(freqs, powers1, [8, 12], log_powers=True)
###################################################################################################
@@ -157,6 +156,6 @@
fig, ax = plt.subplots(figsize=[12, 8])
plot_spectra_shading(freqs_al, powers_al, [8, 12],
log_powers=True, alpha=0.6, ax=ax)
-plot_spectrum(freqs_al10, powers_al10, log_powers=True,
+plot_spectra(freqs_al10, powers_al10, log_powers=True,
color='black', linewidth=3, label='10 Hz Alpha', ax=ax)
plt.title('Comparing Alphas', {'fontsize' : 20, 'fontweight' : 'bold'});
diff --git a/motivations/measurements/plot_BandRatios.py b/motivations/measurements/plot_BandRatios.py
index 030011dc7..113e93471 100644
--- a/motivations/measurements/plot_BandRatios.py
+++ b/motivations/measurements/plot_BandRatios.py
@@ -44,7 +44,7 @@
from fooof.utils import trim_spectrum
from fooof.sim.gen import gen_power_spectrum
from fooof.sim.utils import set_random_seed
-from fooof.plts.spectra import plot_spectrum_shading, plot_spectra_shading
+from fooof.plts.spectra import plot_spectra_shading
###################################################################################################
@@ -124,9 +124,9 @@ def calc_band_ratio(freqs, powers, low_band, high_band):
###################################################################################################
# Plot the power spectrum, shading the frequency bands used for the ratio
-plot_spectrum_shading(freqs, powers, [bands.theta, bands.beta],
- color='black', shade_colors=shade_color,
- log_powers=True, linewidth=3.5)
+plot_spectra_shading(freqs, powers, [bands.theta, bands.beta],
+ color='black', shade_colors=shade_color,
+ log_powers=True, linewidth=3.5)
###################################################################################################
diff --git a/tutorials/plot_01-ModelDescription.py b/tutorials/plot_01-ModelDescription.py
index 18088d86d..36046fab6 100644
--- a/tutorials/plot_01-ModelDescription.py
+++ b/tutorials/plot_01-ModelDescription.py
@@ -41,7 +41,7 @@
from fooof import FOOOF
from fooof.sim.gen import gen_power_spectrum
from fooof.sim.utils import set_random_seed
-from fooof.plts.spectra import plot_spectrum
+from fooof.plts.spectra import plot_spectra
from fooof.plts.annotate import plot_annotated_model
###################################################################################################
@@ -81,8 +81,8 @@
###################################################################################################
# Plot one of the example power spectra
-plot_spectrum(freqs1, powers1, log_powers=True,
- color='black', label='Original Spectrum')
+plot_spectra(freqs1, powers1, log_powers=True,
+ color='black', label='Original Spectrum')
###################################################################################################
# Conceptual Overview
diff --git a/tutorials/plot_03-FOOOFAlgorithm.py b/tutorials/plot_03-FOOOFAlgorithm.py
index 7a63a0387..5ad2a08c1 100644
--- a/tutorials/plot_03-FOOOFAlgorithm.py
+++ b/tutorials/plot_03-FOOOFAlgorithm.py
@@ -41,7 +41,7 @@
# These are used here to demonstrate the algorithm
# You do not need to import these functions for standard usage of the module
from fooof.sim.gen import gen_aperiodic
-from fooof.plts.spectra import plot_spectrum
+from fooof.plts.spectra import plot_spectra
from fooof.plts.annotate import plot_annotated_peak_search
# Import a utility to download and load example data
@@ -110,10 +110,10 @@
# Plot the initial aperiodic fit
_, ax = plt.subplots(figsize=(12, 10))
-plot_spectrum(fm.freqs, fm.power_spectrum, plt_log,
- label='Original Power Spectrum', color='black', ax=ax)
-plot_spectrum(fm.freqs, init_ap_fit, plt_log, label='Initial Aperiodic Fit',
- color='blue', alpha=0.5, linestyle='dashed', ax=ax)
+plot_spectra(fm.freqs, fm.power_spectrum, plt_log,
+ label='Original Power Spectrum', color='black', ax=ax)
+plot_spectra(fm.freqs, init_ap_fit, plt_log, label='Initial Aperiodic Fit',
+ color='blue', alpha=0.5, linestyle='dashed', ax=ax)
###################################################################################################
# Step 2: Flatten the Spectrum
@@ -131,8 +131,8 @@
init_flat_spec = fm.power_spectrum - init_ap_fit
# Plot the flattened the power spectrum
-plot_spectrum(fm.freqs, init_flat_spec, plt_log,
- label='Flattened Spectrum', color='black')
+plot_spectra(fm.freqs, init_flat_spec, plt_log,
+ label='Flattened Spectrum', color='black')
###################################################################################################
# Step 3: Detect Peaks
@@ -172,7 +172,7 @@
###################################################################################################
# Plot the peak fit: created by re-fitting all of the candidate peaks together
-plot_spectrum(fm.freqs, fm._peak_fit, plt_log, color='green', label='Final Periodic Fit')
+plot_spectra(fm.freqs, fm._peak_fit, plt_log, color='green', label='Final Periodic Fit')
###################################################################################################
# Step 5: Create a Peak-Removed Spectrum
@@ -188,8 +188,8 @@
###################################################################################################
# Plot the peak removed power spectrum, created by removing peak fit from original spectrum
-plot_spectrum(fm.freqs, fm._spectrum_peak_rm, plt_log,
- label='Peak Removed Spectrum', color='black')
+plot_spectra(fm.freqs, fm._spectrum_peak_rm, plt_log,
+ label='Peak Removed Spectrum', color='black')
###################################################################################################
# Step 6: Re-fit the Aperiodic Component
@@ -206,10 +206,10 @@
# Plot the final aperiodic fit, calculated on the peak removed power spectrum
_, ax = plt.subplots(figsize=(12, 10))
-plot_spectrum(fm.freqs, fm._spectrum_peak_rm, plt_log,
- label='Peak Removed Spectrum', color='black', ax=ax)
-plot_spectrum(fm.freqs, fm._ap_fit, plt_log, label='Final Aperiodic Fit',
- color='blue', alpha=0.5, linestyle='dashed', ax=ax)
+plot_spectra(fm.freqs, fm._spectrum_peak_rm, plt_log,
+ label='Peak Removed Spectrum', color='black', ax=ax)
+plot_spectra(fm.freqs, fm._ap_fit, plt_log, label='Final Aperiodic Fit',
+ color='blue', alpha=0.5, linestyle='dashed', ax=ax)
###################################################################################################
# Step 7: Combine the Full Model Fit
@@ -226,8 +226,8 @@
###################################################################################################
# Plot full model, created by combining the peak and aperiodic fits
-plot_spectrum(fm.freqs, fm.fooofed_spectrum_, plt_log,
- label='Full Model', color='red')
+plot_spectra(fm.freqs, fm.fooofed_spectrum_, plt_log,
+ label='Full Model', color='red')
###################################################################################################
#
From 0a85b2af5ee1792f160b7fa6e6afa9de0e349392 Mon Sep 17 00:00:00 2001
From: Tom Donoghue
Date: Mon, 12 Apr 2021 01:47:18 -0400
Subject: [PATCH 3/5] fix merge
---
fooof/plts/error.py | 2 +-
fooof/plts/spectra.py | 14 ++++++++------
fooof/tests/plts/test_spectra.py | 12 ++++++------
3 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/fooof/plts/error.py b/fooof/plts/error.py
index 7c357dafc..af04840f9 100644
--- a/fooof/plts/error.py
+++ b/fooof/plts/error.py
@@ -40,7 +40,7 @@ def plot_spectral_error(freqs, error, shade=None, log_freqs=False, ax=None, **pl
plt_freqs = np.log10(freqs) if log_freqs else freqs
- plot_spectrum(plt_freqs, error, ax=ax, linewidth=3)
+ plot_spectra(plt_freqs, error, ax=ax, linewidth=3)
if np.any(shade):
ax.fill_between(plt_freqs, error-shade, error+shade, alpha=0.25)
diff --git a/fooof/plts/spectra.py b/fooof/plts/spectra.py
index 247a66576..23e09fb54 100644
--- a/fooof/plts/spectra.py
+++ b/fooof/plts/spectra.py
@@ -12,7 +12,7 @@
from fooof.core.modutils import safe_import, check_dependency
from fooof.plts.settings import PLT_FIGSIZES
from fooof.plts.style import style_spectrum_plot, style_plot
-from fooof.plts.utils import check_ax, add_shades, savefig
+from fooof.plts.utils import check_ax, add_shades, savefig, check_plot_kwargs
plt = safe_import('.pyplot', 'matplotlib')
@@ -36,10 +36,10 @@ def plot_spectra(freqs, power_spectra, log_freqs=False, log_powers=False,
Whether to plot the frequency axis in log spacing.
log_powers : bool, optional, default: False
Whether to plot the power axis in log spacing.
- labels : list of str, optional, default: None
- Legend labels for the spectra.
colors : list of str, optional, default: None
Line colors of the spectra.
+ labels : list of str, optional, default: None
+ Legend labels for the spectra.
ax : matplotlib.Axes, optional
Figure axes upon which to plot.
**plot_kwargs
@@ -64,15 +64,17 @@ def plot_spectra(freqs, power_spectra, log_freqs=False, log_powers=False,
# Plot
for freqs, powers, color, label in zip(plt_freqs, plt_powers, colors, labels):
- # Set plot data, logging if requested
+ # Set plot data, logging if requested, and collect color, if absent
freqs = np.log10(freqs) if log_freqs else freqs
powers = np.log10(powers) if log_powers else powers
+ if color:
+ plot_kwargs['color'] = color
- ax.plot(freqs, powers, color=color, label=label, **plot_kwargs)
+ ax.plot(freqs, powers, label=label, **plot_kwargs)
style_spectrum_plot(ax, log_freqs, log_powers)
-
+
@savefig
@check_dependency(plt, 'matplotlib')
def plot_spectra_shading(freqs, power_spectra, shades, shade_colors='r',
diff --git a/fooof/tests/plts/test_spectra.py b/fooof/tests/plts/test_spectra.py
index 75a90c499..8bcb9edf1 100644
--- a/fooof/tests/plts/test_spectra.py
+++ b/fooof/tests/plts/test_spectra.py
@@ -12,9 +12,9 @@
@plot_test
def test_plot_spectra(tfm, tfg, skip_if_no_mpl):
-
+
# Test with 1d inputs - 1d freq array and list of 1d power spectra
- plot_spectra(tfm.freqs, tfm.power_spectrum,
+ plot_spectra(tfm.freqs, tfm.power_spectrum,
save_fig=True, file_path=TEST_PLOTS_PATH, file_name='test_plot_spectra_1d.png')
# Test with 1d inputs - 1d freq array and list of 1d power spectra
@@ -37,10 +37,10 @@ def test_plot_spectra(tfm, tfg, skip_if_no_mpl):
@plot_test
def test_plot_spectra_shading(tfm, tfg, skip_if_no_mpl):
-
- plot_spectrum_shading(tfm.freqs, tfm.power_spectrum, shades=[8, 12], add_center=True,
- save_fig=True, file_path=TEST_PLOTS_PATH,
- file_name='test_plot_spectrum_shading1.png')
+
+ plot_spectra_shading(tfm.freqs, tfm.power_spectrum, shades=[8, 12], add_center=True,
+ save_fig=True, file_path=TEST_PLOTS_PATH,
+ file_name='test_plot_spectrum_shading1.png')
plot_spectra_shading(tfg.freqs, [tfg.power_spectra[0, :], tfg.power_spectra[1, :]],
shades=[8, 12], add_center=True, save_fig=True, file_path=TEST_PLOTS_PATH,
From ffb9d52c0e4c836f828b8578bc21bf44d592e621 Mon Sep 17 00:00:00 2001
From: Tom Donoghue
Date: Mon, 12 Apr 2021 01:49:45 -0400
Subject: [PATCH 4/5] update docstrings for changes
---
fooof/plts/spectra.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/fooof/plts/spectra.py b/fooof/plts/spectra.py
index 23e09fb54..233cb15a2 100644
--- a/fooof/plts/spectra.py
+++ b/fooof/plts/spectra.py
@@ -24,13 +24,13 @@
@check_dependency(plt, 'matplotlib')
def plot_spectra(freqs, power_spectra, log_freqs=False, log_powers=False,
colors=None, labels=None, ax=None, **plot_kwargs):
- """Plot multiple power spectra on the same plot.
+ """Plot one or multiple power spectra.
Parameters
----------
- freqs : 2d array or 1d array or list of 1d array
+ freqs : 1d or 2d array or list of 1d array
Frequency values, to be plotted on the x-axis.
- power_spectra : 2d array or list of 1d array
+ power_spectra : 1d or 2d array or list of 1d array
Power values, to be plotted on the y-axis.
log_freqs : bool, optional, default: False
Whether to plot the frequency axis in log spacing.
@@ -79,13 +79,13 @@ def plot_spectra(freqs, power_spectra, log_freqs=False, log_powers=False,
@check_dependency(plt, 'matplotlib')
def plot_spectra_shading(freqs, power_spectra, shades, shade_colors='r',
add_center=False, ax=None, **plot_kwargs):
- """Plot a group of power spectra with a shaded frequency region (or regions).
+ """Plot one or multiple power spectra with a shaded frequency region (or regions).
Parameters
----------
- freqs : 2d array or 1d array or list of 1d array
+ freqs : 1d or 2d array or list of 1d array
Frequency values, to be plotted on the x-axis.
- power_spectra : 2d array or list of 1d array
+ power_spectra : 1d or 2d array or list of 1d array
Power values, to be plotted on the y-axis.
shades : list of [float, float] or list of list of [float, float]
Shaded region(s) to add to plot, defined as [lower_bound, upper_bound].
From 51651d36b650d575c66d47be4e1f8e24bfc05859 Mon Sep 17 00:00:00 2001
From: ryanhammonds
Date: Mon, 12 Apr 2021 12:22:49 -0700
Subject: [PATCH 5/5] tutorial updates
---
examples/analyses/plot_mne_example.py | 9 +++++----
examples/plots/plot_power_spectra.py | 2 +-
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/examples/analyses/plot_mne_example.py b/examples/analyses/plot_mne_example.py
index 17ea559d8..1e46dafb9 100644
--- a/examples/analyses/plot_mne_example.py
+++ b/examples/analyses/plot_mne_example.py
@@ -284,10 +284,11 @@ def check_nans(data, nan_policy='zero'):
# Compare the power spectra between low and high exponent channels
fig, ax = plt.subplots(figsize=(8, 6))
-plot_spectra(fg.freqs, fg.get_fooof(np.argmin(exps)).power_spectrum,
- ax=ax, label='Low Exponent')
-plot_spectra(fg.freqs, fg.get_fooof(np.argmax(exps)).power_spectrum,
- ax=ax, label='High Exponent')
+
+spectra = [fg.get_fooof(np.argmin(exps)).power_spectrum,
+ fg.get_fooof(np.argmax(exps)).power_spectrum]
+
+plot_spectra(fg.freqs, spectra, ax=ax, labels=['Low Exponent', 'High Exponent'])
###################################################################################################
# Conclusion
diff --git a/examples/plots/plot_power_spectra.py b/examples/plots/plot_power_spectra.py
index df2bf30ef..abc8945ba 100644
--- a/examples/plots/plot_power_spectra.py
+++ b/examples/plots/plot_power_spectra.py
@@ -157,5 +157,5 @@
plot_spectra_shading(freqs_al, powers_al, [8, 12],
log_powers=True, alpha=0.6, ax=ax)
plot_spectra(freqs_al10, powers_al10, log_powers=True,
- color='black', linewidth=3, label='10 Hz Alpha', ax=ax)
+ color='black', linewidth=3, label='10 Hz Alpha', ax=ax)
plt.title('Comparing Alphas', {'fontsize' : 20, 'fontweight' : 'bold'});