# plot stats
    xx, yy = np.meshgrid(times, range(len(freqs)), copy=False, indexing='xy')
    ax.contour(xx, yy, sig, colors='black', levels=[0],
               linestyles='dotted')

    # pretty plot
    pretty_plot(ax)
    ticks = [0]
    for freq in np.arange(10, 71, 10):
        ticks.append(np.where(np.round(freqs) >= freq)[0][0])
    ticks.append(len(freqs))
    ax.set_yticks(ticks)
    ax.set_yticklabels([])
    if ii in [0, (len(analyses)//2)]:
        ax.set_yticklabels([int(freqs[0]), 10, '', 30, '',
                            '', '', '', int(freqs[-1] + .1)])
    xticks = np.arange(-.200, 1.301, .100)
    ax.set_xticks(xticks)
    ax.set_xticklabels([])
    if ii >= (len(analyses)//2):
        ax.set_xticklabels([int(tim * 1e3) if tim in [.0, .800] else ''
                            for tim in xticks])
    ax.axvline([0.], color='k')
    ax.axvline([.800], color='k')
    ax.set_title(analysis['title'])
    pretty_colorbar(im, ax=ax, ticks=[analysis['chance'], np.max(scores)])

report.add_figs_to_section([fig], ['all freqs'], 'all')
report.save()
    smax = '%.2f' % (vmax + analysis['chance'])
    if vmax < 5e-3:
        smin = '0' if vmin == 0 else '%.0e' % vmin
        smax = '%.0e' % vmax

    # Plot topo snapshots
    evoked.crop(-.100, .600)
    opts = dict(sensors=False, scale=1, contours=False, show=False,
                times=np.linspace(0, .500, 6), average=.025, colorbar=True)
    fig_grad = evoked.plot_topomap(cmap=analysis['cmap'], ch_type='grad',
                                   vmin=vmin, vmax=vmax, **opts)
    cax = fig_grad.get_children()[-1]
    cax.set_yticks([vmin, vmax])
    cax.set_yticklabels([smin, smax])
    cax.set_title('')
    report.add_figs_to_section(fig_grad, 'topo_grad', analysis['name'])

    fig_mag = evoked.plot_topomap(ch_type='mag', vmin=vmin_mag, vmax=vmax,
                                  **opts)
    cax = fig_mag.get_children()[-1]
    cax.set_yticks([vmin, vmax])
    cax.set_yticklabels([smin_mag, '', smax])
    cax.set_title('')
    # fig_mag.tight_layout()
    report.add_figs_to_section(fig_mag, 'topo_mag', analysis['name'])

    # Plot butterfly
    fig_butt_m, ax = plt.subplots(1, figsize=fig_grad.get_size_inches())
    plot_butterfly(evoked, ax=ax, sig=sig, color=analysis['color'],
                   ch_type='mag')
    # ax.axvline(800, color='k')
    save(out, 'score', analysis=ana_name)
    return out


# only recompute on the relevant analyses
analyses = [
    ana for ana in analyses
    if ana['name'] in ['target_present', 'target_circAngle']
]
for analysis in analyses:
    out = _stats(analysis)
    scores = out['scores']
    if 'circAngle' in analysis['name']:
        scores /= 2.
    times = out['times']
    alpha = .05
    chance = analysis['chance']
    p_values = stats(scores - chance)
    clim = np.percentile(np.diag(np.mean(scores, axis=0)), 97)
    clim = [chance - (clim - chance), clim]
    fig, ax_gat = plt.subplots(1, figsize=[7, 5.5])
    pretty_gat(np.mean(scores, axis=0),
               times=times,
               sig=p_values < alpha,
               chance=chance,
               ax=ax_gat,
               clim=clim)
    report.add_figs_to_section([fig], [analysis['name']], analysis['name'])

report.save()
            if tilt == 1:
                continue  # do not plot absent case
            plot_tuning(results['tuning'][:, ii, jj, :, tilt],
                        ax=axes[ii, jj], shift=np.pi, color=color)
            plot_tuning(results['tuning'][:, ii, jj, :, tilt],
                        ax=axes[ii, jj], shift=np.pi, color='k', alpha=0.)
        axes[ii, jj].axvline((jj * 2 - 1) * np.pi / 3, color=colors[0])
        axes[ii, jj].axvline(-(jj * 2 - 1) * np.pi / 3, color=colors[2])

pretty_axes(axes, xticklabels=['$-\pi/2$', '', '$\pi/2$'],
            xlabel='Angle Error',
            ylim=[0.014, .08],
            yticks=[0.014, 1./len(results['bins']), .08],
            yticklabels=[1.4, '', 8.], ylabel='Probability')
fig.tight_layout()
report.add_figs_to_section(fig, 'target_probe', 'cross_generalization')

# Plot bias Temporal Generalization Matrices
fig, axes = plt.subplots(2, 2, figsize=[6.15, 5.6])
fig.subplots_adjust(right=0.85, hspace=0.05, wspace=0.05)
for ii in range(2):
    for jj in range(2):
        scores = -np.array(results['bias'][:, ii, jj, ...])
        p_val = results['bias_pval'][ii, jj, :, :]
        pretty_gat(scores.mean(0), times=times, ax=axes[ii, jj],
                   colorbar=False, clim=[-.1, .1], sig=p_val < .05)
        axes[ii, jj].axvline(.800, color='k')
        axes[ii, jj].axhline(.800, color='k')
pretty_axes(axes, ylabelpad=-15, xticks=np.linspace(-.100, 1.400, 13),
            xticklabels=['', 0] + [''] * 13 + [1400, ''])
pretty_colorbar(cax=fig.add_axes([.88, .25, .02, .55]), ax=axes[0, 0])
Exemple #5
0
        zorder = float(vis == 'low')
        y_shift = .1 * float(vis == 'high')
        times = np.linspace(0, 2., len(diag.mean(0))) + .1 * int(vis == 'low')
        axes['decod'].fill_between(
            times, .5 + y_shift, diag.mean(0) + y_shift, color=colors[vis],
            alpha=1., linewidth=0., zorder=zorder)
        axes['decod'].plot(times, diag.mean(0) + y_shift, color='k',
                           zorder=zorder)
        axes['decod'].set_xticks([])
        axes['decod'].set_yticks([])
        axes['decod'].set_aspect('equal')
        for side in ('left', 'right', 'top', 'bottom'):
            axes['decod'].spines[side].set_visible(False)
        axes['decod'].set_ylim(-.1, 1.1)

        # Temporal generalization scores
        axes[vis].matshow(score.mean(0), origin='lower',
                          vmin=0, vmax=1., cmap='RdBu_r')
        axes[vis].set_xticks([])
        axes[vis].set_yticks([])
        pretty_plot(axes[vis])

    # TG subtraction: high vis - low vis
    axes['vis'].matshow(np.mean(scores[:, 1] - scores[:, 0], axis=0),
                        origin='lower', vmin=-.25, vmax=.25, cmap='RdBu_r')
    axes['vis'].set_xticks([])
    axes['vis'].set_yticks([])
    pretty_plot(axes['vis'])
    report.add_figs_to_section([fig], [model], model)
report.save()
        # Print some sig cluster details
        sig = p_val < .05
        diff = np.diff(1. * sig)
        starts, stops = np.where(diff > 0)[0], np.where(diff < 0)[0]
        for start, stop in zip(starts, stops):
            score_toi = np.mean(score[:, start:stop], axis=1)
            details_roi.append(dict(
                roi=roi,
                p_val=p_val[stop],
                start=times[start],
                stop=times[stop],
                mean=np.mean(score_toi),  # FIXME contrast is inverted
                inv_mean=1.-np.mean(score_toi),  # XXX FIXME
                sem=np.std(score_toi) / np.sqrt(len(score))))

    report.add_figs_to_section([fig], section, 'source')
    report.add_htmls_to_section(DataFrame(details_roi).to_html(),
                                section, 'roi')
    report.add_htmls_to_section(DataFrame(details_toi).to_html(),
                                section, 'toi')

    # Print significant clusters on all regions
    connectivity = sparse.csr_matrix(np.eye((data.shape[1])))
    p_vals = stats(data.transpose(0, 2, 1) - chance, None, n_jobs=-1)
    sig_labels = DataFrame(labels[np.where(np.sum(p_vals < .05, axis=0))[0]])
    report.add_htmls_to_section(sig_labels.to_html(), section, 'sig_cluster')

    sig_labels = DataFrame(labels[np.where(np.sum(p_vals < .05, axis=0))[0]])
    report.add_htmls_to_section(sig_labels.to_html(), section, 'sig_cluster')

report.save()
    scores_diag = np.array([np.diag(score) for score in scores])
    diag_offdiag = scores - np.tile([np.diag(score) for score in scores],
                                    [len(times), 1, 1]).transpose(1, 0, 2)
    slices_tois = np.arange(.100, 1.100, .200)

    # Temporal generalization matrices
    clim = np.percentile(np.diag(np.mean(scores, axis=0)), 97)
    clim = [chance-(clim-chance), clim]
    fig_gat, ax_gat = plt.subplots(1, figsize=[7, 5.5])
    pretty_gat(np.mean(scores, axis=0), times=times, sig=p_values < alpha,
               chance=chance, ax=ax_gat, clim=clim)
    ax_gat.axvline(.800, color='k')
    ax_gat.axhline(.800, color='k')
    ax_gat.set_xlabel('Test Times', labelpad=-10)
    ax_gat.set_ylabel('Train Times', labelpad=-15)
    report.add_figs_to_section(fig_gat, 'gat', analysis['name'])

    fig_, ax = plt.subplots(1)
    ax.matshow(np.mean(scores, axis=0), origin='lower',
               extent=[np.min(times), np.max(times)] * 2)
    ax.set_xticks(np.arange(0., 1.200, .01))
    ax.set_yticks(np.arange(0., 1.200, .01))
    figs.append(fig_)

    # ------ Plot times slices score
    fig_offdiag, axs = plt.subplots(len(slices_tois), 1, figsize=[5, 6])
    pretty_slices(scores, times=times, chance=chance, axes=axs,
                  sig=p_values < alpha, sig_diagoff=p_values_off < alpha,
                  colors=[analysis['color'], 'b'], tois=slices_tois,
                  fill_color=analysis['color'])
    for ax in axs:
                        ax=axes[ii, jj],
                        shift=np.pi,
                        color='k',
                        alpha=0.)
        axes[ii, jj].axvline((jj * 2 - 1) * np.pi / 3, color=colors[0])
        axes[ii, jj].axvline(-(jj * 2 - 1) * np.pi / 3, color=colors[2])

pretty_axes(axes,
            xticklabels=['$-\pi/2$', '', '$\pi/2$'],
            xlabel='Angle Error',
            ylim=[0.014, .08],
            yticks=[0.014, 1. / len(results['bins']), .08],
            yticklabels=[1.4, '', 8.],
            ylabel='Probability')
fig.tight_layout()
report.add_figs_to_section(fig, 'target_probe', 'cross_generalization')

# Plot bias Temporal Generalization Matrices
fig, axes = plt.subplots(2, 2, figsize=[6.15, 5.6])
fig.subplots_adjust(right=0.85, hspace=0.05, wspace=0.05)
for ii in range(2):
    for jj in range(2):
        scores = -np.array(results['bias'][:, ii, jj, ...])
        p_val = results['bias_pval'][ii, jj, :, :]
        pretty_gat(scores.mean(0),
                   times=times,
                   ax=axes[ii, jj],
                   colorbar=False,
                   clim=[-.1, .1],
                   sig=p_val < .05)
        axes[ii, jj].axvline(.800, color='k')
# Main plotting
colors = dict(visibility=plt.get_cmap('bwr')(np.linspace(0, 1, 4.)),
              contrast=plt.get_cmap('hot_r')([.5, .75, 1.]))

# Loop across visibility and orientation analyses
for analysis in analyses:
    # Plot correlation of decoding score with visibility and contrast
    scores, R, times = _analyze_continuous(analysis)
    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=[20, 10])
    sig = stats(R['visibility']) < .05
    pretty_decod(-R['visibility'], times=times, sig=sig, ax=ax1,
                 color='purple', fill=True)
    sig = stats(R['contrast']) < .05
    pretty_decod(-R['contrast'], times=times, sig=sig, ax=ax2,
                 color='orange', fill=True)
    report.add_figs_to_section([fig], ['continuous regress'], analysis['name'])

    # Plot decoding score for each visibility level
    all_scores, score_pvals, times = _subscore_pipeline(analysis)
    if 'circAngle' in analysis['name']:
        all_scores /= 2.  # from circle to half circle
    figs, axes = list(), list()
    for vis in range(4):
        fig, ax = plt.subplots(1, figsize=[14, 11])
        scores = all_scores[:, vis, ...]
        p_val = score_pvals[vis]
        pretty_gat(np.nanmean(scores, axis=0), times=times,
                   chance=analysis['chance'],
                   ax=ax, colorbar=False)
        xx, yy = np.meshgrid(times, times, copy=False, indexing='xy')
        ax.contour(xx, yy, p_val < .05, colors='black', levels=[0],
                scale=1,
                contours=False,
                show=False,
                times=np.linspace(0, .500, 6),
                average=.025,
                colorbar=True)
    fig_grad = evoked.plot_topomap(cmap=analysis['cmap'],
                                   ch_type='grad',
                                   vmin=vmin,
                                   vmax=vmax,
                                   **opts)
    cax = fig_grad.get_children()[-1]
    cax.set_yticks([vmin, vmax])
    cax.set_yticklabels([smin, smax])
    cax.set_title('')
    report.add_figs_to_section(fig_grad, 'topo_grad', analysis['name'])

    fig_mag = evoked.plot_topomap(ch_type='mag',
                                  vmin=vmin_mag,
                                  vmax=vmax,
                                  **opts)
    cax = fig_mag.get_children()[-1]
    cax.set_yticks([vmin, vmax])
    cax.set_yticklabels([smin_mag, '', smax])
    cax.set_title('')
    # fig_mag.tight_layout()
    report.add_figs_to_section(fig_mag, 'topo_mag', analysis['name'])

    # Plot butterfly
    fig_butt_m, ax = plt.subplots(1, figsize=fig_grad.get_size_inches())
    plot_butterfly(evoked,
ax.set_xlabel('Visibility Rating')
ax.set_ylabel('Contrast')
ax.zaxis.set_rotate_label(False)
ax.set_zlabel('Response %', rotation=90)
ax.set_xticks(np.linspace(0, 1, 2))
ax.set_yticks([])
ax.set_zticks(np.linspace(0, .7, 2))
ax.set_ylim(.25, 1.)
ax.set_zlim(0, .75)
tmp_planes = ax.zaxis._PLANES
ax.zaxis.grid('off')
ax.zaxis._PLANES = (tmp_planes[2], tmp_planes[3],
                    tmp_planes[0], tmp_planes[1],
                    tmp_planes[4], tmp_planes[5])
# fig.show()
report.add_figs_to_section(fig, 'visibility 3d', 'visibility')


# 2D
fig, ax = plt.subplots(1, figsize=[6, 4])
abs_m = x_vis[:, 0, :].mean(0)
abs_sem = abs_m + x_vis[:, 0, :].mean(0).std(0) / x_vis.shape[0]
pst_m = x_vis[:, 1:, :].mean(1).mean(0)
pst_sem = pst_m + x_vis[:, 1:, :].mean(1).std(0).mean(0) / x_vis.shape[0]
fill = lambda z, c: ax.fill_between(np.linspace(0, 1., 4.), z, alpha=.5,
                                    color=cmap(c),  edgecolor='none')
fill(abs_sem, 0.)
fill(pst_sem, 1.)
fill(abs_m, 0.)
fill(pst_m, 1.)
ax.text(0.1, np.mean(x_vis[:, 0, 0], axis=0) - .05, 'Absent', color=cmap(0.),
                                    [len(times), 1, 1]).transpose(1, 0, 2)
    p_values_off = stats(diag_offdiag)

    # Save stats results
    out = dict(scores=scores, p_values=p_values, p_values_off=p_values_off,
               times=times, analysis=analysis)
    save(out, 'score',  analysis=ana_name)
    return out


# only recompute on the relevant analyses
analyses = [ana for ana in analyses if ana['name'] in
            ['target_present', 'target_circAngle']]
for analysis in analyses:
    out = _stats(analysis)
    scores = out['scores']
    if 'circAngle' in analysis['name']:
        scores /= 2.
    times = out['times']
    alpha = .05
    chance = analysis['chance']
    p_values = stats(scores - chance)
    clim = np.percentile(np.diag(np.mean(scores, axis=0)), 97)
    clim = [chance-(clim-chance), clim]
    fig, ax_gat = plt.subplots(1, figsize=[7, 5.5])
    pretty_gat(np.mean(scores, axis=0), times=times, sig=p_values < alpha,
               chance=chance, ax=ax_gat, clim=clim)
    report.add_figs_to_section([fig], [analysis['name']], analysis['name'])

report.save()
    # Temporal generalization matrices
    clim = np.percentile(np.diag(np.mean(scores, axis=0)), 97)
    clim = [chance - (clim - chance), clim]
    fig_gat, ax_gat = plt.subplots(1, figsize=[7, 5.5])
    pretty_gat(np.mean(scores, axis=0),
               times=times,
               sig=p_values < alpha,
               chance=chance,
               ax=ax_gat,
               clim=clim)
    ax_gat.axvline(.800, color='k')
    ax_gat.axhline(.800, color='k')
    ax_gat.set_xlabel('Test Times', labelpad=-10)
    ax_gat.set_ylabel('Train Times', labelpad=-15)
    report.add_figs_to_section(fig_gat, 'gat', analysis['name'])

    fig_, ax = plt.subplots(1)
    ax.matshow(np.mean(scores, axis=0),
               origin='lower',
               extent=[np.min(times), np.max(times)] * 2)
    ax.set_xticks(np.arange(0., 1.200, .01))
    ax.set_yticks(np.arange(0., 1.200, .01))
    figs.append(fig_)

    # ------ Plot times slices score
    fig_offdiag, axs = plt.subplots(len(slices_tois), 1, figsize=[5, 6])
    pretty_slices(scores,
                  times=times,
                  chance=chance,
                  axes=axs,
    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=[20, 10])
    sig = stats(R['visibility']) < .05
    pretty_decod(-R['visibility'],
                 times=times,
                 sig=sig,
                 ax=ax1,
                 color='purple',
                 fill=True)
    sig = stats(R['contrast']) < .05
    pretty_decod(-R['contrast'],
                 times=times,
                 sig=sig,
                 ax=ax2,
                 color='orange',
                 fill=True)
    report.add_figs_to_section([fig], ['continuous regress'], analysis['name'])

    # Plot decoding score for each visibility level
    all_scores, score_pvals, times = _subscore_pipeline(analysis)
    if 'circAngle' in analysis['name']:
        all_scores /= 2.  # from circle to half circle
    figs, axes = list(), list()
    for vis in range(4):
        fig, ax = plt.subplots(1, figsize=[14, 11])
        scores = all_scores[:, vis, ...]
        p_val = score_pvals[vis]
        pretty_gat(np.nanmean(scores, axis=0),
                   times=times,
                   chance=analysis['chance'],
                   ax=ax,
                   colorbar=False)