def test_plot_topo(): """Test plotting of ERP topography.""" # Show topography evoked = _get_epochs().average() # should auto-find layout plot_evoked_topo([evoked, evoked], merge_grads=True, background_color='w') picked_evoked = evoked.copy().pick_channels(evoked.ch_names[:3]) picked_evoked_eeg = evoked.copy().pick_types(meg=False, eeg=True) picked_evoked_eeg.pick_channels(picked_evoked_eeg.ch_names[:3]) # test scaling for ylim in [dict(mag=[-600, 600]), None]: plot_evoked_topo([picked_evoked] * 2, layout, ylim=ylim) for evo in [evoked, [evoked, picked_evoked]]: pytest.raises(ValueError, plot_evoked_topo, evo, layout, color=['y', 'b']) evoked_delayed_ssp = _get_epochs_delayed_ssp().average() ch_names = evoked_delayed_ssp.ch_names[:3] # make it faster picked_evoked_delayed_ssp = pick_channels_evoked(evoked_delayed_ssp, ch_names) fig = plot_evoked_topo(picked_evoked_delayed_ssp, layout, proj='interactive') func = _get_presser(fig) event = namedtuple('Event', ['inaxes', 'xdata', 'ydata']) func(event(inaxes=fig.axes[0], xdata=fig.axes[0]._mne_axs[0].pos[0], ydata=fig.axes[0]._mne_axs[0].pos[1])) func(event(inaxes=fig.axes[0], xdata=0, ydata=0)) params = dict(evokeds=[picked_evoked_delayed_ssp], times=picked_evoked_delayed_ssp.times, fig=fig, projs=picked_evoked_delayed_ssp.info['projs']) bools = [True] * len(params['projs']) with pytest.warns(RuntimeWarning, match='projection'): _plot_update_evoked_topo_proj(params, bools) # should auto-generate layout plot_evoked_topo(picked_evoked_eeg.copy(), fig_background=np.zeros((4, 3, 3)), proj=True, background_color='k') # Test RMS plot of grad pairs picked_evoked.plot_topo(merge_grads=True, background_color='w') plt.close('all') for ax, idx in iter_topography(evoked.info): ax.plot(evoked.data[idx], color='red') # test status bar message assert (evoked.ch_names[idx] in ax.format_coord(.5, .5)) plt.close('all') cov = read_cov(cov_fname) cov['projs'] = [] evoked.pick_types(meg=True).plot_topo(noise_cov=cov) plt.close('all') # test plot_topo evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all')
def test_plot_evoked(): """Test plotting of evoked.""" import matplotlib.pyplot as plt rng = np.random.RandomState(0) evoked = _get_epochs().average() fig = evoked.plot(proj=True, hline=[1], exclude=[], window_title='foo', time_unit='s') # Test a click ax = fig.get_axes()[0] line = ax.lines[0] _fake_click(fig, ax, [line.get_xdata()[0], line.get_ydata()[0]], 'data') _fake_click(fig, ax, [ax.get_xlim()[0], ax.get_ylim()[1]], 'data') # plot with bad channels excluded & spatial_colors & zorder evoked.plot(exclude='bads', time_unit='s') # test selective updating of dict keys is working. evoked.plot(hline=[1], units=dict(mag='femto foo'), time_unit='s') evoked_delayed_ssp = _get_epochs_delayed_ssp().average() evoked_delayed_ssp.plot(proj='interactive', time_unit='s') evoked_delayed_ssp.apply_proj() assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', time_unit='s') evoked_delayed_ssp.info['projs'] = [] assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', time_unit='s') assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', axes='foo', time_unit='s') plt.close('all') # test GFP only evoked.plot(gfp='only', time_unit='s') assert_raises(ValueError, evoked.plot, gfp='foo', time_unit='s') evoked.plot_image(proj=True, time_unit='ms') # test mask evoked.plot_image(picks=[1, 2], mask=evoked.data > 0, time_unit='s') evoked.plot_image(picks=[1, 2], mask_cmap=None, colorbar=False, mask=np.ones(evoked.data.shape).astype(bool), time_unit='s') with warnings.catch_warnings(record=True) as w: evoked.plot_image(picks=[1, 2], mask=None, mask_style="both", time_unit='s') assert len(w) == 2 assert_raises(ValueError, evoked.plot_image, mask=evoked.data[1:, 1:] > 0, time_unit='s') # plot with bad channels excluded evoked.plot_image(exclude='bads', cmap='interactive', time_unit='s') evoked.plot_image(exclude=evoked.info['bads'], time_unit='s') # same thing plt.close('all') assert_raises(ValueError, evoked.plot_image, picks=[0, 0], time_unit='s') # duplicates evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all') cov = read_cov(cov_fname) cov['method'] = 'empirical' cov['projs'] = [] # avoid warnings # test rank param. evoked.plot_white(cov, rank={'mag': 101, 'grad': 201}, time_unit='s') evoked.plot_white(cov, rank={'mag': 101}, time_unit='s') # test rank param evoked.plot_white(cov, rank={'grad': 201}, time_unit='s') assert_raises( ValueError, evoked.plot_white, cov, rank={'mag': 101, 'grad': 201, 'meg': 306}, time_unit='s') assert_raises( ValueError, evoked.plot_white, cov, rank={'meg': 306}, time_unit='s') evoked.plot_white([cov, cov], time_unit='s') # plot_compare_evokeds: test condition contrast, CI, color assignment plot_compare_evokeds(evoked.copy().pick_types(meg='mag')) plot_compare_evokeds( evoked.copy().pick_types(meg='grad'), picks=[1, 2], show_sensors="upper right", show_legend="upper left") evokeds = [evoked.copy() for _ in range(10)] for evoked in evokeds: evoked.data += (rng.randn(*evoked.data.shape) * np.std(evoked.data, axis=-1, keepdims=True)) for picks in ([0], [1], [2], [0, 2], [1, 2], [0, 1, 2],): figs = plot_compare_evokeds([evokeds], picks=picks, ci=0.95) if not isinstance(figs, list): figs = [figs] for fig in figs: ext = fig.axes[0].collections[0].get_paths()[0].get_extents() xs, ylim = ext.get_points().T assert_allclose(xs, evoked.times[[0, -1]]) line = fig.axes[0].lines[0] xs = line.get_xdata() assert_allclose(xs, evoked.times) ys = line.get_ydata() assert (ys < ylim[1]).all() assert (ys > ylim[0]).all() plt.close('all') evoked.rename_channels({'MEG 2142': "MEG 1642"}) assert len(plot_compare_evokeds(evoked)) == 2 colors = dict(red='r', blue='b') linestyles = dict(red='--', blue='-') red, blue = evoked.copy(), evoked.copy() red.data *= 1.1 blue.data *= 0.9 plot_compare_evokeds([red, blue], picks=3) # list of evokeds plot_compare_evokeds([red, blue], picks=3, truncate_yaxis=True) plot_compare_evokeds([[red, evoked], [blue, evoked]], picks=3) # list of lists # test picking & plotting grads contrast = dict() contrast["red/stim"] = list((evoked.copy(), red)) contrast["blue/stim"] = list((evoked.copy(), blue)) # test a bunch of params at once for evokeds_ in (evoked.copy().pick_types(meg='mag'), contrast, [red, blue], [[red, evoked], [blue, evoked]]): plot_compare_evokeds(evokeds_, picks=0, ci=True) # also tests CI plt.close('all') # test styling + a bunch of other params at once colors, linestyles = dict(red='r', blue='b'), dict(red='--', blue='-') plot_compare_evokeds(contrast, colors=colors, linestyles=linestyles, picks=[0, 2], vlines=[.01, -.04], invert_y=True, truncate_yaxis=False, ylim=dict(mag=(-10, 10)), styles={"red/stim": {"linewidth": 1}}, show_sensors=True) # various bad styles params = [dict(picks=3, colors=dict(fake=1)), dict(picks=3, styles=dict(fake=1)), dict(picks=3, gfp=True), dict(picks=3, show_sensors="a"), dict(colors=dict(red=10., blue=-2))] for param in params: assert_raises(ValueError, plot_compare_evokeds, evoked, **param) assert_raises(TypeError, plot_compare_evokeds, evoked, picks='str') assert_raises(TypeError, plot_compare_evokeds, evoked, vlines='x') plt.close('all') # `evoked` must contain Evokeds assert_raises(TypeError, plot_compare_evokeds, [[1, 2], [3, 4]]) # `ci` must be float or None assert_raises(TypeError, plot_compare_evokeds, contrast, ci='err') # test all-positive ylim contrast["red/stim"], contrast["blue/stim"] = red, blue plot_compare_evokeds(contrast, picks=[0], colors=['r', 'b'], ylim=dict(mag=(1, 10)), ci=_parametric_ci, truncate_yaxis='max_ticks', show_sensors=False, show_legend=False) # sequential colors evokeds = (evoked, blue, red) contrasts = {"a{}/b".format(ii): ev for ii, ev in enumerate(evokeds)} colors = {"a" + str(ii): ii for ii, _ in enumerate(evokeds)} contrasts["a1/c"] = evoked.copy() for split in (True, False): for linestyles in (["-"], {"b": "-", "c": ":"}): plot_compare_evokeds( contrasts, colors=colors, picks=[0], cmap='Reds', split_legend=split, linestyles=linestyles, ci=False, show_sensors=False) colors = {"a" + str(ii): ii / len(evokeds) for ii, _ in enumerate(evokeds)} plot_compare_evokeds( contrasts, colors=colors, picks=[0], cmap='Reds', split_legend=split, linestyles=linestyles, ci=False, show_sensors=False) red.info["chs"][0]["loc"][:2] = 0 # test plotting channel at zero plot_compare_evokeds(red, picks=[0], ci=lambda x: [x.std(axis=0), -x.std(axis=0)]) plot_compare_evokeds([red, blue], picks=[0], cmap="summer", ci=None, split_legend=None) plot_compare_evokeds([red, blue], cmap=None, split_legend=True) assert_raises(ValueError, plot_compare_evokeds, [red] * 20) assert_raises(ValueError, plot_compare_evokeds, contrasts, cmap='summer') plt.close('all') # Hack to test plotting of maxfiltered data evoked_sss = evoked.copy() sss = dict(sss_info=dict(in_order=80, components=np.arange(80))) evoked_sss.info['proc_history'] = [dict(max_info=sss)] evoked_sss.plot_white(cov, rank={'meg': 64}, time_unit='s') assert_raises( ValueError, evoked_sss.plot_white, cov, rank={'grad': 201}, time_unit='s') evoked_sss.plot_white(cov, time_unit='s') # plot with bad channels excluded, spatial_colors, zorder & pos. layout evoked.rename_channels({'MEG 0133': 'MEG 0000'}) evoked.plot(exclude=evoked.info['bads'], spatial_colors=True, gfp=True, zorder='std', time_unit='s') evoked.plot(exclude=[], spatial_colors=True, zorder='unsorted', time_unit='s') assert_raises(TypeError, evoked.plot, zorder='asdf', time_unit='s') plt.close('all') evoked.plot_sensors() # Test plot_sensors plt.close('all') evoked.pick_channels(evoked.ch_names[:4]) with catch_logging() as log_file: evoked.plot(verbose=True, time_unit='s') assert_true('Need more than one' in log_file.getvalue())
def test_plot_topo(): """Test plotting of ERP topography.""" # Show topography evoked = _get_epochs().average() # should auto-find layout plot_evoked_topo([evoked, evoked], merge_grads=True, background_color='w') picked_evoked = evoked.copy().pick_channels(evoked.ch_names[:3]) picked_evoked_eeg = evoked.copy().pick_types(meg=False, eeg=True) picked_evoked_eeg.pick_channels(picked_evoked_eeg.ch_names[:3]) # test scaling for ylim in [dict(mag=[-600, 600]), None]: plot_evoked_topo([picked_evoked] * 2, layout, ylim=ylim) for evo in [evoked, [evoked, picked_evoked]]: pytest.raises(ValueError, plot_evoked_topo, evo, layout, color=['y', 'b']) evoked_delayed_ssp = _get_epochs_delayed_ssp().average() ch_names = evoked_delayed_ssp.ch_names[:3] # make it faster picked_evoked_delayed_ssp = pick_channels_evoked(evoked_delayed_ssp, ch_names) fig = plot_evoked_topo(picked_evoked_delayed_ssp, layout, proj='interactive') func = _get_presser(fig) event = namedtuple('Event', ['inaxes', 'xdata', 'ydata']) func( event(inaxes=fig.axes[0], xdata=fig.axes[0]._mne_axs[0].pos[0], ydata=fig.axes[0]._mne_axs[0].pos[1])) func(event(inaxes=fig.axes[0], xdata=0, ydata=0)) params = dict(evokeds=[picked_evoked_delayed_ssp], times=picked_evoked_delayed_ssp.times, fig=fig, projs=picked_evoked_delayed_ssp.info['projs']) bools = [True] * len(params['projs']) with pytest.warns(RuntimeWarning, match='projection'): _plot_update_evoked_topo_proj(params, bools) # should auto-generate layout plot_evoked_topo(picked_evoked_eeg.copy(), fig_background=np.zeros((4, 3, 3)), proj=True, background_color='k') # Test RMS plot of grad pairs picked_evoked.plot_topo(merge_grads=True, background_color='w') plt.close('all') for ax, idx in iter_topography(evoked.info, legend=True): ax.plot(evoked.data[idx], color='red') # test status bar message if idx != -1: assert (evoked.ch_names[idx] in ax.format_coord(.5, .5)) assert idx == -1 plt.close('all') cov = read_cov(cov_fname) cov['projs'] = [] evoked.pick_types(meg=True).plot_topo(noise_cov=cov) plt.close('all') # test plot_topo evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all') for ax, idx in iter_topography(evoked.info): # brief test with false ax.plot([0, 1, 2]) break plt.close('all')
def test_plot_evoked(): """Test plotting of evoked.""" import matplotlib.pyplot as plt evoked = _get_epochs().average() with warnings.catch_warnings(record=True): fig = evoked.plot(proj=True, hline=[1], exclude=[], window_title='foo') # Test a click ax = fig.get_axes()[0] line = ax.lines[0] _fake_click( fig, ax, [line.get_xdata()[0], line.get_ydata()[0]], 'data') _fake_click(fig, ax, [ax.get_xlim()[0], ax.get_ylim()[1]], 'data') # plot with bad channels excluded & spatial_colors & zorder evoked.plot(exclude='bads') # test selective updating of dict keys is working. evoked.plot(hline=[1], units=dict(mag='femto foo')) evoked_delayed_ssp = _get_epochs_delayed_ssp().average() evoked_delayed_ssp.plot(proj='interactive') evoked_delayed_ssp.apply_proj() assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive') evoked_delayed_ssp.info['projs'] = [] assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive') assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', axes='foo') plt.close('all') # test GFP only evoked.plot(gfp='only') assert_raises(ValueError, evoked.plot, gfp='foo') evoked.plot_image(proj=True) # plot with bad channels excluded evoked.plot_image(exclude='bads', cmap='interactive') evoked.plot_image(exclude=evoked.info['bads']) # does the same thing plt.close('all') evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all') cov = read_cov(cov_fname) cov['method'] = 'empirical' # test rank param. evoked.plot_white(cov, rank={'mag': 101, 'grad': 201}) evoked.plot_white(cov, rank={'mag': 101}) # test rank param. evoked.plot_white(cov, rank={'grad': 201}) # test rank param. assert_raises(ValueError, evoked.plot_white, cov, rank={ 'mag': 101, 'grad': 201, 'meg': 306 }) assert_raises(ValueError, evoked.plot_white, cov, rank={'meg': 306}) evoked.plot_white([cov, cov]) # plot_compare_evokeds: test condition contrast, CI, color assignment plot_compare_evokeds(evoked.copy().pick_types(meg='mag')) plot_compare_evokeds(evoked.copy().pick_types(meg='grad'), picks=[1, 2]) evoked.rename_channels({'MEG 2142': "MEG 1642"}) assert len(plot_compare_evokeds(evoked)) == 2 colors = dict(red='r', blue='b') linestyles = dict(red='--', blue='-') red, blue = evoked.copy(), evoked.copy() red.data *= 1.1 blue.data *= 0.9 plot_compare_evokeds([red, blue], picks=3) # list of evokeds plot_compare_evokeds([red, blue], picks=3, truncate_yaxis=True) plot_compare_evokeds([[red, evoked], [blue, evoked]], picks=3) # list of lists # test picking & plotting grads contrast = dict() contrast["red/stim"] = list((evoked.copy(), red)) contrast["blue/stim"] = list((evoked.copy(), blue)) # test a bunch of params at once plot_compare_evokeds(contrast, colors=colors, linestyles=linestyles, picks=[0, 2], vlines=[.01, -.04], invert_y=True, truncate_yaxis=False, ylim=dict(mag=(-10, 10)), styles={"red/stim": { "linewidth": 1 }}, show_sensors=True) assert_raises(ValueError, plot_compare_evokeds, contrast, picks='str') # bad picks: not int assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, colors=dict(fake=1)) # 'fake' not in conds assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, styles=dict(fake=1)) # 'fake' not in conds assert_raises(ValueError, plot_compare_evokeds, [[1, 2], [3, 4]], picks=3) # evoked must contain Evokeds assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, styles=dict(err=1)) # bad styles dict assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, gfp=True) # no single-channel GFP assert_raises(TypeError, plot_compare_evokeds, evoked, picks=3, ci='fake') # ci must be float or None assert_raises(TypeError, plot_compare_evokeds, evoked, picks=3, show_sensors='a') # show_sensors must be int or bool contrast["red/stim"] = red contrast["blue/stim"] = blue plot_compare_evokeds(contrast, picks=[0], colors=['r', 'b'], ylim=dict(mag=(1, 10)), ci=_parametric_ci, truncate_yaxis='max_ticks') red.info["chs"][0]["loc"][:2] = 0 # test plotting channel at zero plot_compare_evokeds(red, picks=[0]) # Hack to test plotting of maxfiltered data evoked_sss = evoked.copy() sss = dict(sss_info=dict(in_order=80, components=np.arange(80))) evoked_sss.info['proc_history'] = [dict(max_info=sss)] evoked_sss.plot_white(cov, rank={'meg': 64}) assert_raises(ValueError, evoked_sss.plot_white, cov, rank={'grad': 201}) evoked_sss.plot_white(cov_fname) # plot with bad channels excluded, spatial_colors, zorder & pos. layout evoked.rename_channels({'MEG 0133': 'MEG 0000'}) evoked.plot(exclude=evoked.info['bads'], spatial_colors=True, gfp=True, zorder='std') evoked.plot(exclude=[], spatial_colors=True, zorder='unsorted') assert_raises(TypeError, evoked.plot, zorder='asdf') plt.close('all') evoked.plot_sensors() # Test plot_sensors plt.close('all') evoked.pick_channels(evoked.ch_names[:4]) with catch_logging() as log_file: evoked.plot(verbose=True) assert_true('Need more than one' in log_file.getvalue())
def test_plot_evoked(): """Test plotting of evoked.""" import matplotlib.pyplot as plt evoked = _get_epochs().average() with warnings.catch_warnings(record=True): fig = evoked.plot(proj=True, hline=[1], exclude=[], window_title='foo') # Test a click ax = fig.get_axes()[0] line = ax.lines[0] _fake_click( fig, ax, [line.get_xdata()[0], line.get_ydata()[0]], 'data') _fake_click(fig, ax, [ax.get_xlim()[0], ax.get_ylim()[1]], 'data') # plot with bad channels excluded & spatial_colors & zorder evoked.plot(exclude='bads') # test selective updating of dict keys is working. evoked.plot(hline=[1], units=dict(mag='femto foo')) evoked_delayed_ssp = _get_epochs_delayed_ssp().average() evoked_delayed_ssp.plot(proj='interactive') evoked_delayed_ssp.apply_proj() assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive') evoked_delayed_ssp.info['projs'] = [] assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive') assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', axes='foo') plt.close('all') # test GFP only evoked.plot(gfp='only') assert_raises(ValueError, evoked.plot, gfp='foo') evoked.plot_image(proj=True) # plot with bad channels excluded evoked.plot_image(exclude='bads', cmap='interactive') evoked.plot_image(exclude=evoked.info['bads']) # does the same thing plt.close('all') evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all') cov = read_cov(cov_fname) cov['method'] = 'empirical' evoked.plot_white(cov) evoked.plot_white([cov, cov]) # plot_compare_evokeds: test condition contrast, CI, color assignment plot_compare_evokeds(evoked.copy().pick_types(meg='mag')) plot_compare_evokeds(evoked.copy().pick_types(meg='grad'), picks=[1, 2]) evoked.rename_channels({'MEG 2142': "MEG 1642"}) assert len(plot_compare_evokeds(evoked)) == 2 colors = dict(red='r', blue='b') linestyles = dict(red='--', blue='-') red, blue = evoked.copy(), evoked.copy() red.data *= 1.1 blue.data *= 0.9 plot_compare_evokeds([red, blue], picks=3) # list of evokeds plot_compare_evokeds([red, blue], picks=3, truncate_yaxis=True) plot_compare_evokeds([[red, evoked], [blue, evoked]], picks=3) # list of lists # test picking & plotting grads contrast = dict() contrast["red/stim"] = list((evoked.copy(), red)) contrast["blue/stim"] = list((evoked.copy(), blue)) # test a bunch of params at once plot_compare_evokeds(contrast, colors=colors, linestyles=linestyles, picks=[0, 2], vlines=[.01, -.04], invert_y=True, truncate_yaxis=False, ylim=dict(mag=(-10, 10)), styles={"red/stim": { "linewidth": 1 }}) assert_raises(ValueError, plot_compare_evokeds, contrast, picks='str') # bad picks: not int assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, colors=dict(fake=1)) # 'fake' not in conds assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, styles=dict(fake=1)) # 'fake' not in conds assert_raises(ValueError, plot_compare_evokeds, [[1, 2], [3, 4]], picks=3) # evoked must contain Evokeds assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, styles=dict(err=1)) # bad styles dict assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, gfp=True) # no single-channel GFP assert_raises(TypeError, plot_compare_evokeds, evoked, picks=3, ci='fake') # ci must be float or None contrast["red/stim"] = red contrast["blue/stim"] = blue plot_compare_evokeds(contrast, picks=[0], colors=['r', 'b'], ylim=dict(mag=(1, 10)), ci=_parametric_ci) # isolated test of CI functions arr = np.linspace(0, 1, 1000)[..., np.newaxis] assert_allclose(_ci(arr, method="parametric"), _ci(arr, method="bootstrap"), rtol=.005) assert_allclose(_bootstrap_ci(arr, statfun="median", random_state=0), _bootstrap_ci(arr, statfun="mean", random_state=0), rtol=.1) # Hack to test plotting of maxfiltered data evoked_sss = evoked.copy() evoked_sss.info['proc_history'] = [dict(max_info=None)] evoked_sss.plot_white(cov) evoked_sss.plot_white(cov_fname) # plot with bad channels excluded, spatial_colors, zorder & pos. layout evoked.rename_channels({'MEG 0133': 'MEG 0000'}) evoked.plot(exclude=evoked.info['bads'], spatial_colors=True, gfp=True, zorder='std') evoked.plot(exclude=[], spatial_colors=True, zorder='unsorted') assert_raises(TypeError, evoked.plot, zorder='asdf') plt.close('all') evoked.plot_sensors() # Test plot_sensors plt.close('all') evoked.pick_channels(evoked.ch_names[:4]) with warnings.catch_warnings(record=True) as ws: evoked.plot() assert_equal(len(ws), 2) assert_true(all('Need more than one' in str(w.message) for w in ws))
def test_plot_topo(): """Test plotting of ERP topography.""" # Show topography evoked = _get_epochs().average() # should auto-find layout plot_evoked_topo([evoked, evoked], merge_grads=True, background_color='w') # Test jointplot evoked.plot_joint(ts_args=dict(time_unit='s'), topomap_args=dict(time_unit='s')) def return_inds(d): # to test function kwarg to zorder arg of evoked.plot return list(range(d.shape[0])) evoked.plot_joint(title='test', topomap_args=dict(contours=0, res=8, time_unit='ms'), ts_args=dict(spatial_colors=True, zorder=return_inds, time_unit='s')) pytest.raises(ValueError, evoked.plot_joint, ts_args=dict(axes=True, time_unit='s')) axes = plt.subplots(nrows=3)[-1].flatten().tolist() evoked.plot_joint(times=[0], picks=[6, 7, 8], ts_args=dict(axes=axes[0]), topomap_args={"axes": axes[1:], "time_unit": "s"}) plt.close() pytest.raises(ValueError, evoked.plot_joint, picks=[6, 7, 8], ts_args=dict(axes=axes[0]), topomap_args=dict(axes=axes[2:])) picked_evoked = evoked.copy().pick_channels(evoked.ch_names[:3]) picked_evoked_eeg = evoked.copy().pick_types(meg=False, eeg=True) picked_evoked_eeg.pick_channels(picked_evoked_eeg.ch_names[:3]) # test scaling for ylim in [dict(mag=[-600, 600]), None]: plot_evoked_topo([picked_evoked] * 2, layout, ylim=ylim) for evo in [evoked, [evoked, picked_evoked]]: pytest.raises(ValueError, plot_evoked_topo, evo, layout, color=['y', 'b']) evoked_delayed_ssp = _get_epochs_delayed_ssp().average() ch_names = evoked_delayed_ssp.ch_names[:3] # make it faster picked_evoked_delayed_ssp = pick_channels_evoked(evoked_delayed_ssp, ch_names) fig = plot_evoked_topo(picked_evoked_delayed_ssp, layout, proj='interactive') func = _get_presser(fig) event = namedtuple('Event', ['inaxes', 'xdata', 'ydata']) func(event(inaxes=fig.axes[0], xdata=fig.axes[0]._mne_axs[0].pos[0], ydata=fig.axes[0]._mne_axs[0].pos[1])) func(event(inaxes=fig.axes[0], xdata=0, ydata=0)) params = dict(evokeds=[picked_evoked_delayed_ssp], times=picked_evoked_delayed_ssp.times, fig=fig, projs=picked_evoked_delayed_ssp.info['projs']) bools = [True] * len(params['projs']) with pytest.warns(RuntimeWarning, match='projection'): _plot_update_evoked_topo_proj(params, bools) # should auto-generate layout plot_evoked_topo(picked_evoked_eeg.copy(), fig_background=np.zeros((4, 3, 3)), proj=True, background_color='k') # Test RMS plot of grad pairs picked_evoked.plot_topo(merge_grads=True, background_color='w') plt.close('all') for ax, idx in iter_topography(evoked.info): ax.plot(evoked.data[idx], color='red') # test status bar message assert (evoked.ch_names[idx] in ax.format_coord(.5, .5)) plt.close('all') cov = read_cov(cov_fname) cov['projs'] = [] evoked.pick_types(meg=True).plot_topo(noise_cov=cov) plt.close('all') # test plot_topo evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all')
def test_plot_evoked(): """Test plotting of evoked.""" import matplotlib.pyplot as plt rng = np.random.RandomState(0) evoked = _get_epochs().average() fig = evoked.plot(proj=True, hline=[1], exclude=[], window_title='foo', time_unit='s') # Test a click ax = fig.get_axes()[0] line = ax.lines[0] _fake_click(fig, ax, [line.get_xdata()[0], line.get_ydata()[0]], 'data') _fake_click(fig, ax, [ax.get_xlim()[0], ax.get_ylim()[1]], 'data') # plot with bad channels excluded & spatial_colors & zorder evoked.plot(exclude='bads', time_unit='s') # test selective updating of dict keys is working. evoked.plot(hline=[1], units=dict(mag='femto foo'), time_unit='s') evoked_delayed_ssp = _get_epochs_delayed_ssp().average() evoked_delayed_ssp.plot(proj='interactive', time_unit='s') evoked_delayed_ssp.apply_proj() pytest.raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', time_unit='s') evoked_delayed_ssp.info['projs'] = [] pytest.raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', time_unit='s') pytest.raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', axes='foo', time_unit='s') plt.close('all') # test GFP only evoked.plot(gfp='only', time_unit='s') pytest.raises(ValueError, evoked.plot, gfp='foo', time_unit='s') evoked.plot_image(proj=True, time_unit='ms') # fail nicely on NaN evoked_nan = evoked.copy() evoked_nan.data[:, 0] = np.nan pytest.raises(ValueError, evoked_nan.plot) with np.errstate(invalid='ignore'): pytest.raises(ValueError, evoked_nan.plot_image) pytest.raises(ValueError, evoked_nan.plot_joint) # test mask evoked.plot_image(picks=[1, 2], mask=evoked.data > 0, time_unit='s') evoked.plot_image(picks=[1, 2], mask_cmap=None, colorbar=False, mask=np.ones(evoked.data.shape).astype(bool), time_unit='s') with pytest.warns(RuntimeWarning, match='not adding contour'): evoked.plot_image(picks=[1, 2], mask=None, mask_style="both", time_unit='s') pytest.raises(ValueError, evoked.plot_image, mask=evoked.data[1:, 1:] > 0, time_unit='s') # plot with bad channels excluded evoked.plot_image(exclude='bads', cmap='interactive', time_unit='s') evoked.plot_image(exclude=evoked.info['bads'], time_unit='s') # same thing plt.close('all') pytest.raises(ValueError, evoked.plot_image, picks=[0, 0], time_unit='s') # duplicates ch_names = ["MEG 1131", "MEG 0111"] picks = [evoked.ch_names.index(ch) for ch in ch_names] evoked.plot_image(show_names="all", time_unit='s', picks=picks) yticklabels = plt.gca().get_yticklabels() for tick_target, tick_observed in zip(ch_names, yticklabels): assert tick_target in str(tick_observed) evoked.plot_image(show_names=True, time_unit='s') # test groupby evoked.plot_image(group_by=dict(sel=[0, 7]), axes=dict(sel=plt.axes())) plt.close('all') for group_by, axes in (("something", dict()), (dict(), "something")): pytest.raises(ValueError, evoked.plot_image, group_by=group_by, axes=axes) # test plot_topo evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all') cov = read_cov(cov_fname) cov['method'] = 'empirical' cov['projs'] = [] # avoid warnings # test rank param. evoked.plot_white(cov, rank={'mag': 101, 'grad': 201}, time_unit='s') evoked.plot_white(cov, rank={'mag': 101}, time_unit='s') # test rank param evoked.plot_white(cov, rank={'grad': 201}, time_unit='s') pytest.raises( ValueError, evoked.plot_white, cov, rank={'mag': 101, 'grad': 201, 'meg': 306}, time_unit='s') pytest.raises( ValueError, evoked.plot_white, cov, rank={'meg': 306}, time_unit='s') evoked.plot_white([cov, cov], time_unit='s') # plot_compare_evokeds: test condition contrast, CI, color assignment plot_compare_evokeds(evoked.copy().pick_types(meg='mag')) plot_compare_evokeds( evoked.copy().pick_types(meg='grad'), picks=[1, 2], show_sensors="upper right", show_legend="upper left") evokeds = [evoked.copy() for _ in range(10)] for evoked in evokeds: evoked.data += (rng.randn(*evoked.data.shape) * np.std(evoked.data, axis=-1, keepdims=True)) for picks in ([0], [1], [2], [0, 2], [1, 2], [0, 1, 2],): figs = plot_compare_evokeds([evokeds], picks=picks, ci=0.95) if not isinstance(figs, list): figs = [figs] for fig in figs: ext = fig.axes[0].collections[0].get_paths()[0].get_extents() xs, ylim = ext.get_points().T assert_allclose(xs, evoked.times[[0, -1]]) line = fig.axes[0].lines[0] xs = line.get_xdata() assert_allclose(xs, evoked.times) ys = line.get_ydata() assert (ys < ylim[1]).all() assert (ys > ylim[0]).all() plt.close('all') evoked.rename_channels({'MEG 2142': "MEG 1642"}) assert len(plot_compare_evokeds(evoked)) == 2 colors = dict(red='r', blue='b') linestyles = dict(red='--', blue='-') red, blue = evoked.copy(), evoked.copy() red.data *= 1.1 blue.data *= 0.9 plot_compare_evokeds([red, blue], picks=3) # list of evokeds plot_compare_evokeds([red, blue], picks=3, truncate_yaxis=True, vlines=[]) # also testing empty vlines here plot_compare_evokeds([[red, evoked], [blue, evoked]], picks=3) # list of lists # test picking & plotting grads contrast = dict() contrast["red/stim"] = list((evoked.copy(), red)) contrast["blue/stim"] = list((evoked.copy(), blue)) # test a bunch of params at once for evokeds_ in (evoked.copy().pick_types(meg='mag'), contrast, [red, blue], [[red, evoked], [blue, evoked]]): plot_compare_evokeds(evokeds_, picks=0, ci=True) # also tests CI plt.close('all') # test styling + a bunch of other params at once colors, linestyles = dict(red='r', blue='b'), dict(red='--', blue='-') plot_compare_evokeds(contrast, colors=colors, linestyles=linestyles, picks=[0, 2], vlines=[.01, -.04], invert_y=True, truncate_yaxis=False, ylim=dict(mag=(-10, 10)), styles={"red/stim": {"linewidth": 1}}, show_sensors=True) # various bad styles params = [dict(picks=3, colors=dict(fake=1)), dict(picks=3, styles=dict(fake=1)), dict(picks=3, gfp=True), dict(picks=3, show_sensors="a"), dict(colors=dict(red=10., blue=-2))] for param in params: pytest.raises(ValueError, plot_compare_evokeds, evoked, **param) pytest.raises(TypeError, plot_compare_evokeds, evoked, picks='str') pytest.raises(TypeError, plot_compare_evokeds, evoked, vlines='x') plt.close('all') # `evoked` must contain Evokeds pytest.raises(TypeError, plot_compare_evokeds, [[1, 2], [3, 4]]) # `ci` must be float or None pytest.raises(TypeError, plot_compare_evokeds, contrast, ci='err') # test all-positive ylim contrast["red/stim"], contrast["blue/stim"] = red, blue plot_compare_evokeds(contrast, picks=[0], colors=['r', 'b'], ylim=dict(mag=(1, 10)), ci=_parametric_ci, truncate_yaxis='max_ticks', show_sensors=False, show_legend=False) # sequential colors evokeds = (evoked, blue, red) contrasts = {"a{}/b".format(ii): ev for ii, ev in enumerate(evokeds)} colors = {"a" + str(ii): ii for ii, _ in enumerate(evokeds)} contrasts["a1/c"] = evoked.copy() for split in (True, False): for linestyles in (["-"], {"b": "-", "c": ":"}): plot_compare_evokeds( contrasts, colors=colors, picks=[0], cmap='Reds', split_legend=split, linestyles=linestyles, ci=False, show_sensors=False) colors = {"a" + str(ii): ii / len(evokeds) for ii, _ in enumerate(evokeds)} plot_compare_evokeds( contrasts, colors=colors, picks=[0], cmap='Reds', split_legend=split, linestyles=linestyles, ci=False, show_sensors=False) red.info["chs"][0]["loc"][:2] = 0 # test plotting channel at zero plot_compare_evokeds(red, picks=[0], ci=lambda x: [x.std(axis=0), -x.std(axis=0)]) plot_compare_evokeds([red, blue], picks=[0], cmap="summer", ci=None, split_legend=None) plot_compare_evokeds([red, blue], cmap=None, split_legend=True) pytest.raises(ValueError, plot_compare_evokeds, [red] * 20) pytest.raises(ValueError, plot_compare_evokeds, contrasts, cmap='summer') plt.close('all') # Hack to test plotting of maxfiltered data evoked_sss = evoked.copy() sss = dict(sss_info=dict(in_order=80, components=np.arange(80))) evoked_sss.info['proc_history'] = [dict(max_info=sss)] evoked_sss.plot_white(cov, rank={'meg': 64}, time_unit='s') pytest.raises( ValueError, evoked_sss.plot_white, cov, rank={'grad': 201}, time_unit='s') evoked_sss.plot_white(cov, time_unit='s') # plot with bad channels excluded, spatial_colors, zorder & pos. layout evoked.rename_channels({'MEG 0133': 'MEG 0000'}) evoked.plot(exclude=evoked.info['bads'], spatial_colors=True, gfp=True, zorder='std', time_unit='s') evoked.plot(exclude=[], spatial_colors=True, zorder='unsorted', time_unit='s') pytest.raises(TypeError, evoked.plot, zorder='asdf', time_unit='s') plt.close('all') evoked.plot_sensors() # Test plot_sensors plt.close('all') evoked.pick_channels(evoked.ch_names[:4]) with catch_logging() as log_file: evoked.plot(verbose=True, time_unit='s') assert 'Need more than one' in log_file.getvalue()
def test_plot_evoked(): """Test plotting of evoked.""" import matplotlib.pyplot as plt evoked = _get_epochs().average() with warnings.catch_warnings(record=True): fig = evoked.plot(proj=True, hline=[1], exclude=[], window_title='foo') # Test a click ax = fig.get_axes()[0] line = ax.lines[0] _fake_click(fig, ax, [line.get_xdata()[0], line.get_ydata()[0]], 'data') _fake_click(fig, ax, [ax.get_xlim()[0], ax.get_ylim()[1]], 'data') # plot with bad channels excluded & spatial_colors & zorder evoked.plot(exclude='bads') # test selective updating of dict keys is working. evoked.plot(hline=[1], units=dict(mag='femto foo')) evoked_delayed_ssp = _get_epochs_delayed_ssp().average() evoked_delayed_ssp.plot(proj='interactive') evoked_delayed_ssp.apply_proj() assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive') evoked_delayed_ssp.info['projs'] = [] assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive') assert_raises(RuntimeError, evoked_delayed_ssp.plot, proj='interactive', axes='foo') plt.close('all') # test GFP only evoked.plot(gfp='only') assert_raises(ValueError, evoked.plot, gfp='foo') evoked.plot_image(proj=True) # plot with bad channels excluded evoked.plot_image(exclude='bads', cmap='interactive') evoked.plot_image(exclude=evoked.info['bads']) # does the same thing plt.close('all') evoked.plot_topo() # should auto-find layout _line_plot_onselect(0, 200, ['mag', 'grad'], evoked.info, evoked.data, evoked.times) plt.close('all') cov = read_cov(cov_fname) cov['method'] = 'empirical' evoked.plot_white(cov) evoked.plot_white([cov, cov]) # plot_compare_evokeds: test condition contrast, CI, color assignment plot_compare_evokeds(evoked.copy().pick_types(meg='mag')) evoked.rename_channels({'MEG 2142': "MEG 1642"}) assert len(plot_compare_evokeds(evoked)) == 2 colors = dict(red='r', blue='b') linestyles = dict(red='--', blue='-') red, blue = evoked.copy(), evoked.copy() red.data *= 1.1 blue.data *= 0.9 plot_compare_evokeds([red, blue], picks=3) # list of evokeds plot_compare_evokeds([[red, evoked], [blue, evoked]], picks=3) # list of lists # test picking & plotting grads contrast = dict() contrast["red/stim"] = list((evoked.copy(), red)) contrast["blue/stim"] = list((evoked.copy(), blue)) # test a bunch of params at once plot_compare_evokeds(contrast, colors=colors, linestyles=linestyles, picks=[0, 2], vlines=[.01, -.04], invert_y=True, truncate_yaxis=False, ylim=dict(mag=(-10, 10)), styles={"red/stim": {"linewidth": 1}}) assert_raises(ValueError, plot_compare_evokeds, contrast, picks='str') # bad picks: not int assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, colors=dict(fake=1)) # 'fake' not in conds assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, styles=dict(fake=1)) # 'fake' not in conds assert_raises(ValueError, plot_compare_evokeds, [[1, 2], [3, 4]], picks=3) # evoked must contain Evokeds assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, styles=dict(err=1)) # bad styles dict assert_raises(ValueError, plot_compare_evokeds, evoked, picks=3, gfp=True) # no single-channel GFP assert_raises(TypeError, plot_compare_evokeds, evoked, picks=3, ci='fake') # ci must be float or None contrast["red/stim"] = red contrast["blue/stim"] = blue plot_compare_evokeds(contrast, picks=[0], colors=['r', 'b'], ylim=dict(mag=(1, 10))) # Hack to test plotting of maxfiltered data evoked_sss = evoked.copy() evoked_sss.info['proc_history'] = [dict(max_info=None)] evoked_sss.plot_white(cov) evoked_sss.plot_white(cov_fname) # plot with bad channels excluded, spatial_colors, zorder & pos. layout evoked.rename_channels({'MEG 0133': 'MEG 0000'}) evoked.plot(exclude=evoked.info['bads'], spatial_colors=True, gfp=True, zorder='std') evoked.plot(exclude=[], spatial_colors=True, zorder='unsorted') assert_raises(TypeError, evoked.plot, zorder='asdf') plt.close('all') evoked.plot_sensors() # Test plot_sensors plt.close('all')