import matplotlib as mpl
from matplotlib import cm, colors
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
from scipy.sparse import csc_matrix, dia_matrix, linalg as sla
from utils import *
FIG_FONTSIZE = 18
FIG_TITLE_FONTSIZE = 28
FIG_SUBPLOT_TITLE_FONTSIZE = 18
FIG_LINE_WIDTH = 4
FIG_TICK_LABEL_SIZE = 14
FIG_BORDER_WIDTH = 2
FIG_TICK_WIDTH = 2
def plot_1d_data(data, filename, split_points=None, split_weights=None):
fig = plt.figure()
plt.tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
plt.scatter(np.arange(len(data)), data, color='lightgray')
if split_points is not None:
xmin = [0] + split_points[0:-1]
plt.hlines(y=split_weights, xmin=xmin, xmax=split_points, color='red')
plt.xlim(0,split_points[-1])
plt.savefig(filename, bbox_inches='tight')
plt.clf()
plt.close(fig)
def plot_fmri_results(grid_data, weights, d2f, filename):
points = np.zeros(grid_data.shape)
points[:,:] = np.nan
points.T[d2f.T != -1] = weights
#print 'points[d2f != -1]: {0}'.format(points[d2f != -1])
#print 'd2f[50]: {0}'.format((d2f != -1)[50])
#print 'points[50]: {0}'.format(points[50])
plot_2d(filename, grid_data, weights=points.flatten())
def plot_3d(filename, data, weights=None, true_weights=None, posteriors=None, discoveries=None, axis=0):
for i in range(data.shape[axis]):
if axis == 0:
d = np.array(data[i])
w = np.array(weights[i]) if weights is not None else None
t = np.array(true_weights[i]) if true_weights is not None else None
p = np.array(posteriors[i]) if posteriors is not None else None
r = np.array(discoveries[i]) if discoveries is not None else None
elif axis == 1:
d = np.array(data[:,i,:])
w = np.array(weights[:,i,:]) if weights is not None else None
t = np.array(true_weights[:,i,:]) if true_weights is not None else None
p = np.array(posteriors[:,i,:]) if posteriors is not None else None
r = np.array(discoveries[:,i,:]) if discoveries is not None else None
elif axis == 2:
d = np.array(data[:,:,i])
w = np.array(weights[:,:,i]) if weights is not None else None
t = np.array(true_weights[:,:,i]) if true_weights is not None else None
p = np.array(posteriors[:,:,i]) if posteriors is not None else None
r = np.array(discoveries[:,:,i]) if discoveries is not None else None
else:
raise Exception('Invalid 3d axis value: axis={0}'.format(axis))
plot_2d(filename.format(i), d, w, t, p, r)
def plot_2d_slice(ax, data, weights, true_weights, posteriors, discoveries):
cmap = cm.binary
cmap.set_bad('white', 1.)
if true_weights is not None:
ax[0].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
ax[0].imshow(true_weights, cmap=cm.binary, interpolation='none', origin='lower', vmin=0, vmax=1)
ax[0].set_title('Truth', fontsize=FIG_SUBPLOT_TITLE_FONTSIZE)
ax = np.delete(ax, 0)
if weights is not None:
ax[1].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
ax[1].imshow(weights, cmap=cm.binary, interpolation='none', origin='lower', vmin=0, vmax=1)
ax[1].set_title('Smoothed Weights', fontsize=FIG_SUBPLOT_TITLE_FONTSIZE)
ax = np.delete(ax, 1)
if posteriors is not None:
ax[1].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
ax[1].imshow(posteriors, cmap=cm.binary, interpolation='none', origin='lower', vmin=0, vmax=1)
ax[1].set_title('Posteriors', fontsize=FIG_SUBPLOT_TITLE_FONTSIZE)
ax = np.delete(ax, 1)
if discoveries is not None:
ax[1].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
ax[1].imshow(discoveries, cmap=cm.binary, interpolation='none', origin='lower', vmin=0, vmax=1)
ax[1].set_title('Discoveries', fontsize=FIG_SUBPLOT_TITLE_FONTSIZE)
ax = np.delete(ax, 1)
if type(ax) is np.ndarray:
ax = ax[0]
masked_data = np.ma.array(data, mask=np.isnan(data))
ax.tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
heatmap = ax.imshow(masked_data, cmap=cmap, interpolation='none', origin='lower', vmin=0, vmax=1)
ax.set_title('Observed', fontsize=FIG_SUBPLOT_TITLE_FONTSIZE)
heatmap.set_norm(colors.Normalize(vmin=0., vmax=1.))
return heatmap
def plot_2d(filename, data, weights=None, true_weights=None, posteriors=None, discoveries=None):
cols = 1
if discoveries is not None:
cols += 1
if posteriors is not None:
cols += 1
if true_weights is not None:
cols += 1
if weights is not None:
cols += 1
fig, ax = plt.subplots(1, cols, figsize=(5*cols+1, 5))
heatmap = plot_2d_slice(ax, data, weights, true_weights, posteriors, discoveries)
fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.09, 0.02, 0.8])
fig.colorbar(heatmap, cax=cbar_ax)
plt.savefig(filename, bbox_inches='tight')
plt.clf()
plt.close(fig)
def plot_1d_results(data, weights, filename, split_points=None, split_weights=None):
fig, ax = plt.subplots()
ax.scatter(np.arange(len(data)), data, color='lightgray')
if split_points is not None:
xmin = [0] + split_points[0:-1]
ax.hlines(y=split_weights, xmin=xmin, xmax=split_points, color='blue', label='Truth')
ax.tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
ax.plot(np.arange(len(weights)), weights, label='Smoothed FDR', color='orange')
ax.set_xlim(0,len(data))
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.savefig(filename, bbox_inches='tight')
plt.clf()
plt.close(fig)
def plot_path(results, filename):
fig, axarr = plt.subplots(1,4, sharex=True, figsize=(21, 5))
axarr[0].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
axarr[1].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
axarr[2].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
axarr[3].tick_params(axis='both', which='major', labelsize=FIG_TICK_LABEL_SIZE, width=FIG_TICK_WIDTH)
axarr[0].plot(results['lambda'], results['loglikelihood'], lw=FIG_LINE_WIDTH)
axarr[0].axvline(results['lambda'][np.argmax(results['loglikelihood'])], ymin=results['loglikelihood'].min(), ymax=results['loglikelihood'].max(), color='r', linestyle='--')
axarr[1].plot(results['lambda'], results['dof'], lw=FIG_LINE_WIDTH)
axarr[1].axvline(results['lambda'][np.argmin(results['dof'])], ymin=results['dof'].min(), ymax=results['dof'].max(), color='r', linestyle='--')
axarr[2].plot(results['lambda'], results['aic'], lw=FIG_LINE_WIDTH)
axarr[2].axvline(results['lambda'][np.argmin(results['aic'])], ymin=results['aic'].min(), ymax=results['aic'].max(), color='r', linestyle='--')
axarr[3].plot(results['lambda'], results['bic'], lw=FIG_LINE_WIDTH)
axarr[3].axvline(results['lambda'][np.argmin(results['bic'])], ymin=results['bic'].min(), ymax=results['bic'].max(), color='r', linestyle='--')
axarr[0].set_title('Log-Likelihood', fontsize=FIG_TITLE_FONTSIZE)
axarr[1].set_title('Degrees of Freedom', fontsize=FIG_TITLE_FONTSIZE)
axarr[2].set_title('AIC', fontsize=FIG_TITLE_FONTSIZE)
axarr[3].set_title('BIC', fontsize=FIG_TITLE_FONTSIZE)
fig.tight_layout()
plt.savefig(filename, bbox_inches='tight')
plt.close(fig)
def plot_plateau_sizes_vs_posteriors(plateaus, posteriors, filename):
probs = np.array([posteriors[list(p)].mean() for v,p in plateaus])
sizes = np.array([len(p) for v,p in plateaus])
#no_outliers = abs(sizes - np.mean(sizes)) < 1 * np.std(sizes)
no_outliers = sizes < 100
fig = plt.figure()
plt.scatter(sizes[no_outliers], probs[no_outliers])
plt.xlabel('Plateau size')
plt.ylabel('Mean posterior probability')
plt.ylim(0,1)
plt.savefig(filename, bbox_inches='tight')
plt.clf()
plt.close(fig)