# 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])
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)