From 039e712156066d5a4d2a10b5d8797f7b72614dce Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Thu, 3 Sep 2020 22:36:18 -0400 Subject: [PATCH] FIX: Fix bug with raw scrolling (#8089) (#8212) --- mne/conftest.py | 1 + mne/viz/raw.py | 24 +++++++++++++++++------- mne/viz/tests/test_raw.py | 17 +++++++++++++---- mne/viz/utils.py | 12 +++++++++--- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/mne/conftest.py b/mne/conftest.py index 29a9816e8ed..b6d26911869 100644 --- a/mne/conftest.py +++ b/mne/conftest.py @@ -88,6 +88,7 @@ def pytest_configure(config): ignore:.*tostring.*is deprecated.*:DeprecationWarning always:.*get_data.* is deprecated in favor of.*:DeprecationWarning ignore:.*Passing the dash.*: + ignore:.*a deprecated alias.*: """ # noqa: E501 for warning_line in warning_lines.split('\n'): warning_line = warning_line.strip() diff --git a/mne/viz/raw.py b/mne/viz/raw.py index f6c99bfd533..d284f9fa91b 100644 --- a/mne/viz/raw.py +++ b/mne/viz/raw.py @@ -8,6 +8,7 @@ import copy from functools import partial +import warnings import numpy as np @@ -649,7 +650,9 @@ def _prepare_mne_browse_raw(params, title, bgcolor, color, bad_color, inds, figsize = _get_figsize_from_config() params['fig'] = figure_nobar(facecolor=bgcolor, figsize=figsize) - params['fig'].canvas.set_window_title(title or "Raw") + with warnings.catch_warnings(record=True): + warnings.simplefilter('ignore') + params['fig'].canvas.set_window_title(title or "Raw") # most of the axes setup is done in _prepare_mne_browse _prepare_mne_browse(params, xlabel='Time (s)') ax = params['ax'] @@ -719,7 +722,9 @@ def _prepare_mne_browse_raw(params, title, bgcolor, color, bad_color, inds, params['lines'] = [ax.plot([np.nan], antialiased=True, linewidth=0.5)[0] for _ in range(n_ch)] - ax.set_yticklabels(['X' * max([len(ch) for ch in info['ch_names']])]) + + ax.set_yticklabels(['X' * max([len(ch) for ch in info['ch_names']])] * + len(params['offsets'])) params['fig_annotation'] = None params['fig_help'] = None params['segment_line'] = None @@ -742,7 +747,6 @@ def _plot_raw_traces(params, color, bad_color, event_lines=None, offsets = params['offsets'] params['bad_color'] = bad_color ax = params['ax'] - labels = ax.yaxis.get_ticklabels() # Scalebars for bar in params.get('scalebars', {}).values(): ax.lines.remove(bar) @@ -751,6 +755,7 @@ def _plot_raw_traces(params, color, bad_color, event_lines=None, params['ax'].texts = [] # do the plotting tick_list = list() + tick_colors = list() for ii in range(n_channels): ch_ind = ii + ch_start # let's be generous here and allow users to pass @@ -798,13 +803,11 @@ def _plot_raw_traces(params, color, bad_color, event_lines=None, this_z = 2 elif params['types'][ii] == 'grad': this_z = 3 - for label in labels: - label.set_color('black') else: # set label color this_color = (bad_color if ch_name in info['bads'] else this_color) - labels[ii].set_color(this_color) + tick_colors.append(this_color) lines[ii].set_zorder(this_z) # add a scale bar if (params['show_scalebars'] and @@ -904,6 +907,11 @@ def _plot_raw_traces(params, color, bad_color, event_lines=None, params['ax'].set_yticks(params['offsets'][:len(tick_list)]) params['ax'].set_yticklabels(tick_list, rotation=0) _set_ax_label_style(params['ax'], params) + else: + tick_colors = ['k'] * len(params['ax'].get_yticks()) + for tick_color, tick in zip(tick_colors, + params['ax'].yaxis.get_ticklabels()): + tick.set_color(tick_color) if 'fig_selection' not in params: params['vsel_patch'].set_y(params['ch_start']) params['fig'].canvas.draw() @@ -1055,7 +1063,9 @@ def _setup_browser_selection(raw, kind, selector=True): if not selector: return order fig_selection = figure_nobar(figsize=(2, 6), dpi=80) - fig_selection.canvas.set_window_title('Selection') + with warnings.catch_warnings(record=True): + warnings.simplefilter('ignore') + fig_selection.canvas.set_window_title('Selection') rax = plt.subplot2grid((6, 1), (2, 0), rowspan=4, colspan=1) topo_ax = plt.subplot2grid((6, 1), (0, 0), rowspan=2, colspan=1) keys = np.concatenate([keys, ['Custom']]) diff --git a/mne/viz/tests/test_raw.py b/mne/viz/tests/test_raw.py index 63f34c5db58..ef4aedf73a3 100644 --- a/mne/viz/tests/test_raw.py +++ b/mne/viz/tests/test_raw.py @@ -173,14 +173,15 @@ def test_scale_bar(): plt.close('all') -def test_plot_raw(): +def test_plot_raw_traces(): """Test plotting of raw data.""" raw = _get_raw() raw.info['lowpass'] = 10. # allow heavy decim during plotting events = _get_events() plt.close('all') # ensure all are closed assert len(plt.get_fignums()) == 0 - fig = raw.plot(events=events, order=[1, 7, 3], group_by='original') + fig = raw.plot(events=events, order=[1, 7, 5, 2, 3], n_channels=3, + group_by='original') assert len(plt.get_fignums()) == 1 # make sure fig._mne_params is present @@ -190,13 +191,21 @@ def test_plot_raw(): x = fig.get_axes()[0].lines[1].get_xdata().mean() y = fig.get_axes()[0].lines[1].get_ydata().mean() data_ax = fig.axes[0] + assert len(fig.axes) == 5 _fake_click(fig, data_ax, [x, y], xform='data') # mark a bad channel _fake_click(fig, data_ax, [x, y], xform='data') # unmark a bad channel _fake_click(fig, data_ax, [0.5, 0.999]) # click elsewhere in 1st axes _fake_click(fig, data_ax, [-0.1, 0.9]) # click on y-label - _fake_click(fig, fig.get_axes()[1], [0.5, 0.5]) # change time - _fake_click(fig, fig.get_axes()[2], [0.5, 0.5]) # change channels + _fake_click(fig, fig.axes[1], [0.5, 0.5]) # change time + labels = [label.get_text() for label in data_ax.get_yticklabels()] + assert labels == [raw.ch_names[1], raw.ch_names[7], raw.ch_names[5]] + _fake_click(fig, fig.axes[2], [0.5, 0.01]) # change channels to end + labels = [label.get_text() for label in data_ax.get_yticklabels()] + assert labels == [raw.ch_names[2], raw.ch_names[3]] + _fake_click(fig, fig.axes[2], [0.5, 0.5]) # change channels to mid + labels = [label.get_text() for label in data_ax.get_yticklabels()] + assert labels == [raw.ch_names[7], raw.ch_names[5], raw.ch_names[2]] assert len(plt.get_fignums()) == 1 # open SSP window _fake_click(fig, fig.get_axes()[-1], [0.5, 0.5]) diff --git a/mne/viz/utils.py b/mne/viz/utils.py index 897e625f9af..8f92da5265b 100644 --- a/mne/viz/utils.py +++ b/mne/viz/utils.py @@ -506,7 +506,9 @@ def _draw_proj_checkbox(event, params, draw_current_state=True): width = max([4., max([len(p['desc']) for p in projs]) / 6.0 + 0.5]) height = (len(projs) + 1) / 6.0 + 1.5 fig_proj = figure_nobar(figsize=(width, height)) - fig_proj.canvas.set_window_title('SSP projection vectors') + with warnings.catch_warnings(record=True): + warnings.simplefilter('ignore') + fig_proj.canvas.set_window_title('SSP projection vectors') offset = (1. / 6. / height) params['fig_proj'] = fig_proj # necessary for proper toggling ax_temp = fig_proj.add_axes((0, offset, 1, 0.8 - offset), frameon=False) @@ -1080,7 +1082,9 @@ def _setup_annotation_fig(params): annotations_closed = partial(_annotations_closed, params=params) fig.canvas.mpl_connect('close_event', annotations_closed) - fig.canvas.set_window_title('Annotations') + with warnings.catch_warnings(record=True): + warnings.simplefilter('ignore') + fig.canvas.set_window_title('Annotations') fig.radio = RadioButtons(ax, labels, activecolor='#cccccc') radius = 0.15 circles = fig.radio.circles @@ -1265,7 +1269,9 @@ def _select_bads(event, params, bads): def _show_help(col1, col2, width, height): fig_help = figure_nobar(figsize=(width, height), dpi=80) - fig_help.canvas.set_window_title('Help') + with warnings.catch_warnings(record=True): + warnings.simplefilter('ignore') + fig_help.canvas.set_window_title('Help') ax = fig_help.add_subplot(111) celltext = [[c1, c2] for c1, c2 in zip(col1.strip().split("\n"),