def _annotation_helper(raw, events=False): """Test interactive annotations.""" # Some of our checks here require modern mpl to work properly n_anns = len(raw.annotations) plt.close('all') if events: events = np.array([[raw.first_samp + 100, 0, 1], [raw.first_samp + 300, 0, 3]]) n_events = len(events) else: events = None n_events = 0 fig = raw.plot(events=events) assert len(plt.get_fignums()) == 1 data_ax = fig.mne.ax_main fig.canvas.key_press_event('a') # annotation mode assert len(plt.get_fignums()) == 2 # +2 from the scale bars n_scale = 2 assert len(data_ax.texts) == n_anns + n_events + n_scale # modify description to create label "BAD test" ann_fig = fig.mne.fig_annotation for key in ['backspace'] + list(' test;'): # semicolon is ignored ann_fig.canvas.key_press_event(key) ann_fig.canvas.key_press_event('enter') # change annotation label for ix in (-1, 0): xy = ann_fig.mne.radio_ax.buttons.circles[ix].center _fake_click(ann_fig, ann_fig.mne.radio_ax, xy, xform='data') # draw annotation _fake_click(fig, data_ax, [1., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='release') assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert raw.annotations.description[n_anns] == 'BAD test' assert len(data_ax.texts) == n_anns + 1 + n_events + n_scale onset = raw.annotations.onset[n_anns] want_onset = _sync_onset(raw, 1., inverse=True) assert_allclose(onset, want_onset) assert_allclose(raw.annotations.duration[n_anns], 4.) # test hover event fig.canvas.key_press_event('p') # first turn on draggable mode assert fig.mne.draggable_annotations hover_kwargs = dict(xform='data', button=None, kind='motion') _fake_click(fig, data_ax, [4.6, 1.], **hover_kwargs) # well inside ann. _fake_click(fig, data_ax, [4.9, 1.], **hover_kwargs) # almost at edge assert fig.mne.annotation_hover_line is not None _fake_click(fig, data_ax, [5.5, 1.], **hover_kwargs) # well outside ann. assert fig.mne.annotation_hover_line is None # more tests of hover line _fake_click(fig, data_ax, [4.6, 1.], **hover_kwargs) # well inside ann. _fake_click(fig, data_ax, [4.9, 1.], **hover_kwargs) # almost at edge assert fig.mne.annotation_hover_line is not None fig.canvas.key_press_event('p') # turn off draggable mode, then move a bit _fake_click(fig, data_ax, [4.95, 1.], **hover_kwargs) assert fig.mne.annotation_hover_line is None fig.canvas.key_press_event('p') # turn draggable mode back on # modify annotation from end (duration 4 → 1.5) _fake_click(fig, data_ax, [4.9, 1.], xform='data', button=None, kind='motion') # ease up to it _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [2.5, 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [2.5, 1.], xform='data', button=1, kind='release') assert raw.annotations.onset[n_anns] == onset assert_allclose(raw.annotations.duration[n_anns], 1.5) # 4 → 1.5 # modify annotation from beginning (duration 1.5 → 2.0) _fake_click(fig, data_ax, [1., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [0.5, 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [0.5, 1.], xform='data', button=1, kind='release') assert_allclose(raw.annotations.onset[n_anns], onset - 0.5, atol=1e-10) assert_allclose(raw.annotations.duration[n_anns], 2.0) # 1.5 → 2.0 assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert raw.annotations.description[n_anns] == 'BAD test' assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale fig.canvas.key_press_event('shift+right') assert len(fig.axes[0].texts) == n_scale fig.canvas.key_press_event('shift+left') assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale # draw another annotation merging the two _fake_click(fig, data_ax, [5.5, 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [2., 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [2., 1.], xform='data', button=1, kind='release') # delete the annotation assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert_allclose(raw.annotations.onset[n_anns], onset - 0.5, atol=1e-10) assert_allclose(raw.annotations.duration[n_anns], 5.0) assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale # Delete _fake_click(fig, data_ax, [1.5, 1.], xform='data', button=3, kind='press') # exit, re-enter, then exit a different way fig.canvas.key_press_event('a') # exit fig.canvas.key_press_event('a') # enter fig.mne.fig_annotation.canvas.key_press_event('escape') # exit again assert len(raw.annotations.onset) == n_anns assert len(fig.axes[0].texts) == n_anns + n_events + n_scale fig.canvas.key_press_event('shift+right') assert len(fig.axes[0].texts) == n_scale fig.canvas.key_press_event('shift+left') assert len(fig.axes[0].texts) == n_anns + n_events + n_scale plt.close('all')
def _annotation_helper(raw, events=False): """Test interactive annotations.""" # Some of our checks here require modern mpl to work properly mpl_good_enough = LooseVersion(matplotlib.__version__) >= '2.0' n_anns = len(raw.annotations) plt.close('all') if events: events = np.array([[raw.first_samp + 100, 0, 1], [raw.first_samp + 300, 0, 3]]) n_events = len(events) else: events = None n_events = 0 fig = raw.plot(events=events) assert len(plt.get_fignums()) == 1 data_ax = fig.axes[0] fig.canvas.key_press_event('a') # annotation mode assert len(plt.get_fignums()) == 2 # +2 from the scale bars n_scale = 2 assert len(fig.axes[0].texts) == n_anns + n_events + n_scale # modify description ann_fig = plt.gcf() for key in ' test': ann_fig.canvas.key_press_event(key) ann_fig.canvas.key_press_event('enter') ann_fig = plt.gcf() # XXX: _fake_click raises an error on Agg backend _annotation_radio_clicked('', ann_fig.radio, data_ax.selector) # draw annotation fig.canvas.key_press_event('p') # use snap mode _fake_click(fig, data_ax, [1., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='release') assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert raw.annotations.description[n_anns] == 'BAD_ test' assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale onset = raw.annotations.onset[n_anns] want_onset = _sync_onset(raw, 1., inverse=True) assert_allclose(onset, want_onset) assert_allclose(raw.annotations.duration[n_anns], 4.) # hover event _fake_click(fig, data_ax, [4.5, 1.], xform='data', button=None, kind='motion') _fake_click(fig, data_ax, [4.7, 1.], xform='data', button=None, kind='motion') # modify annotation from end _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [2.5, 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [2.5, 1.], xform='data', button=1, kind='release') if mpl_good_enough: assert raw.annotations.onset[n_anns] == onset assert_allclose(raw.annotations.duration[n_anns], 1.5) # modify annotation from beginning _fake_click(fig, data_ax, [1., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [0.5, 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [0.5, 1.], xform='data', button=1, kind='release') if mpl_good_enough: assert_allclose(raw.annotations.onset[n_anns], onset - 0.5, atol=1e-10) assert_allclose(raw.annotations.duration[n_anns], 2.0) assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert raw.annotations.description[n_anns] == 'BAD_ test' assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale fig.canvas.key_press_event('shift+right') assert len(fig.axes[0].texts) == n_scale fig.canvas.key_press_event('shift+left') assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale # draw another annotation merging the two _fake_click(fig, data_ax, [5.5, 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [2., 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [2., 1.], xform='data', button=1, kind='release') # delete the annotation assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 if mpl_good_enough: assert_allclose(raw.annotations.onset[n_anns], onset - 0.5, atol=1e-10) assert_allclose(raw.annotations.duration[n_anns], 5.0) assert len(fig.axes[0].texts) == n_anns + 1 + n_events + n_scale # Delete _fake_click(fig, data_ax, [1.5, 1.], xform='data', button=3, kind='press') fig.canvas.key_press_event('a') # exit annotation mode assert len(raw.annotations.onset) == n_anns assert len(fig.axes[0].texts) == n_anns + n_events + n_scale fig.canvas.key_press_event('shift+right') assert len(fig.axes[0].texts) == n_scale fig.canvas.key_press_event('shift+left') assert len(fig.axes[0].texts) == n_anns + n_events + n_scale plt.close('all')
def _annotation_helper(raw, events=False): """Helper for testing interactive annotations.""" import matplotlib.pyplot as plt # Some of our checks here require modern mpl to work properly mpl_good_enough = LooseVersion(matplotlib.__version__) >= '2.0' n_anns = 0 if raw.annotations is None else len(raw.annotations.onset) plt.close('all') if events: events = np.array([[raw.first_samp + 100, 0, 1], [raw.first_samp + 300, 0, 3]]) n_events = len(events) else: events = None n_events = 0 fig = raw.plot(events=events) assert len(plt.get_fignums()) == 1 data_ax = fig.axes[0] fig.canvas.key_press_event('a') # annotation mode assert len(plt.get_fignums()) == 2 assert len(fig.axes[0].texts) == n_anns + n_events # modify description ann_fig = plt.gcf() for key in ' test': ann_fig.canvas.key_press_event(key) ann_fig.canvas.key_press_event('enter') ann_fig = plt.gcf() # XXX: _fake_click raises an error on Agg backend _annotation_radio_clicked('', ann_fig.radio, data_ax.selector) # draw annotation _fake_click(fig, data_ax, [1., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='release') assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert raw.annotations.description[n_anns] == 'BAD_ test' assert len(fig.axes[0].texts) == n_anns + 1 + n_events onset = raw.annotations.onset[n_anns] want_onset = _sync_onset(raw, 1., inverse=True) assert_allclose(onset, want_onset) assert_allclose(raw.annotations.duration[n_anns], 4.) # hover event _fake_click(fig, data_ax, [4.5, 1.], xform='data', button=None, kind='motion') _fake_click(fig, data_ax, [4.7, 1.], xform='data', button=None, kind='motion') # modify annotation from end _fake_click(fig, data_ax, [5., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [2.5, 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [2.5, 1.], xform='data', button=1, kind='release') if mpl_good_enough: assert raw.annotations.onset[n_anns] == onset assert_allclose(raw.annotations.duration[n_anns], 1.5) # modify annotation from beginning _fake_click(fig, data_ax, [1., 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [0.5, 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [0.5, 1.], xform='data', button=1, kind='release') if mpl_good_enough: assert_allclose(raw.annotations.onset[n_anns], onset - 0.5, atol=1e-10) assert_allclose(raw.annotations.duration[n_anns], 2.0) assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 assert raw.annotations.description[n_anns] == 'BAD_ test' assert len(fig.axes[0].texts) == n_anns + 1 + n_events fig.canvas.key_press_event('shift+right') assert len(fig.axes[0].texts) == 0 fig.canvas.key_press_event('shift+left') assert len(fig.axes[0].texts) == n_anns + 1 + n_events # draw another annotation merging the two _fake_click(fig, data_ax, [5.5, 1.], xform='data', button=1, kind='press') _fake_click(fig, data_ax, [2., 1.], xform='data', button=1, kind='motion') _fake_click(fig, data_ax, [2., 1.], xform='data', button=1, kind='release') # delete the annotation assert len(raw.annotations.onset) == n_anns + 1 assert len(raw.annotations.duration) == n_anns + 1 assert len(raw.annotations.description) == n_anns + 1 if mpl_good_enough: assert_allclose(raw.annotations.onset[n_anns], onset - 0.5, atol=1e-10) assert_allclose(raw.annotations.duration[n_anns], 5.0) assert len(fig.axes[0].texts) == n_anns + 1 + n_events # Delete _fake_click(fig, data_ax, [1.5, 1.], xform='data', button=3, kind='press') fig.canvas.key_press_event('a') # exit annotation mode assert len(raw.annotations.onset) == n_anns assert len(fig.axes[0].texts) == n_anns + n_events fig.canvas.key_press_event('shift+right') assert len(fig.axes[0].texts) == 0 fig.canvas.key_press_event('shift+left') assert len(fig.axes[0].texts) == n_anns + n_events plt.close('all')