Esempio n. 1
0
def plotProjection(results, axis1=0, axis2=1, 
                   names_list=CN_globalVars.sm_names, scolor_dict=CN_globalVars.scolors, markers_dict=CN_globalVars.markers, 
                   leaveSM=None, leaveSM_results=None, leaveSM_edgeColor='orange',
                   figsize=(6.8, 6.5), axisLabelPrefix='', title=None, bbox_to_anchor=(1.13, 0.875)):
    fig = plt.figure(figsize=figsize)
    ax = plt.subplot(111)
    i = 0
    for currSM in names_list:
        if currSM != leaveSM:
            ax.scatter(results[i, axis1], results[i, axis2], 
                       color=scolor_dict[currSM], marker=markers_dict[currSM], label=currSM,
                       edgecolor='black', linewidth=2, s=120)
            i += 1
    if leaveSM:
        ax.scatter(leaveSM_results[0, axis1], leaveSM_results[0, axis2], 
                   color=scolor_dict[leaveSM], marker=markers_dict[leaveSM], label=leaveSM,
                   edgecolor=leaveSM_edgeColor, linewidth=2, s=120)
    plotlib.setproperties(xlabel=axisLabelPrefix+'component {}'.format(axis1+1), 
                          ylabel=axisLabelPrefix+'component {}'.format(axis2+1),
                          title=title,
                          labelfontsize=22, tickfontsize=22, 
                          symmetric=True, tight=False)
    ax.legend(bbox_to_anchor=bbox_to_anchor, bbox_transform=fig.transFigure, fontsize=14)

    return ax
Esempio n. 2
0
def plotBindingCurvesAcrossTargets(affinityDataList,
                                   variant,
                                   colors=None,
                                   names=None,
                                   norm=False,
                                   ax=None):
    '''Plot a binding curve of a particular variant'''

    if colors is None:
        colors = sns.color_palette("Paired", 12)

    if ax is None:
        fig = plt.figure(figsize=(4, 4))
        ax = fig.add_subplot(111)

    for i, affinityData in enumerate(affinityDataList):

        # Load data
        subSeries = affinityData.getVariantBindingSeries(variant)
        if len(subSeries) == 0:
            print 'No fluorescence data associated with variant %s' % str(
                variant)
            return
        concentrations = affinityData.x
        variant_table = affinityData.variant_table
        variant_data = variant_table.loc[variant]

        if norm:
            fmax = variant_data['fmax']
            subSeries = subSeries.copy() / fmax
            variant_data = variant_data.copy()
            for field in [
                    'fmax_init', 'fmin_init', 'fmax_lb', 'fmax', 'fmax_ub',
                    'fmin_lb', 'fmin', 'fmin_ub'
            ]:
                variant_data[field] = variant_data[field] / fmax

        # Plot
        plotting.plotFitCurve(concentrations, subSeries, variant_data, ax=ax)

        ax.lines[i * 4 + 3].set_color(colors[i])
        ax.lines[i * 4 + 3].set_linewidth(2)
        if names is not None:
            ax.lines[i * 4 + 3].set_label(names[i])

    if norm:
        ylabel = 'Normalized fluorescence'
    else:
        ylabel = 'Fluorescence'
    plotlib.setproperties(xlabel='Concentration (nM)',
                          ylabel=ylabel,
                          labelfontsize=16,
                          tickfontsize=16,
                          legend=names,
                          legendloc=2,
                          legendfontsize=12)

    return ax
Esempio n. 3
0
def doubleMutant(allData_aggPF, mutantSM, targetSM, normSM, names, norm=False, coop=False):
    # Define variables
    data = allData_aggPF[targetSM]['sm_norm_diff_signals_2']['median']
    mutantRefVariant = allData_aggPF[mutantSM]['sm_norm_diff_signals_2']['median'].idxmax()
    targetRefVariant = allData_aggPF[targetSM]['sm_norm_diff_signals_2']['median'].idxmax()
    normRefVariant = allData_aggPF[normSM]['sm_norm_diff_signals_2']['median'].idxmax()
    if norm:
        targetRefSignal = allData_aggPF[targetSM]['sm_norm_diff_signals_2']['median'][targetRefVariant]
        normRefSignal = allData_aggPF[normSM]['sm_norm_diff_signals_2']['median'][normRefVariant]
    else:
        targetRefSignal = 1
        normRefSignal = 1
    libSeq = 'NNGGATTTTCCNNNNACGAAGTNNTCCCGAG'
    startPos = 14
    title = 'Mutants of '+names[mutantSM].lower()+'0, in the presence of '+names[targetSM]
    if norm and coop:
        cbarLabel = 'Cooperativity normalized to '+names[targetSM].lower()+'0'
    elif norm and not coop:
        cbarLabel = 'Differential signals normalized to '+names[targetSM].lower()+'0'
    elif not norm and coop:
        cbarLabel = 'Cooperativity'
    else:
        cbarLabel = 'Differential signals'
    
    # Compute vmin and vmax manually (assuming robust=True) so that the color bar
    # scale is the same across the same dataRefVariant
    normRefData = allData_aggPF[normSM]['sm_norm_diff_signals_2']['median'] / normRefSignal
    doubleMutantSignals, mutantLabels = plotlib.doubleMutantMatrix(normRefData, normRefVariant, libSeq, startPos, coop)
    doubleMutantSignals = doubleMutantSignals[~np.isnan(doubleMutantSignals)]
    vmin = np.percentile(doubleMutantSignals, 1)
    vmax = np.percentile(doubleMutantSignals, 99)
    vlim = max(abs(vmin), abs(vmax))
    vmin, vmax = -vlim, vlim
    
    # Make heatmap
    plt.figure(figsize=(12,10))
    ax, cax = plotlib.doubleMutant(data, mutantRefVariant, libSeq, 
                                   startPos=startPos, refSignal=targetRefSignal, 
                                   normToRefSignal=norm, coop=coop,
                                   vmin=vmin, vmax=vmax, cbarLabel=cbarLabel,
                                   triangle='lower', invertY=False, linewidth=3)
    cax.tick_params(labelsize=20)
    cax.yaxis.label.set_fontsize(20)
    plotlib.setproperties(title=title, labelfontsize=20, titlefontsize=20)
    
    # Save to file
    if coop:
        figureOutput = 'coop'
    else:
        figureOutput = 'doubleMutant'
    if norm:
        figureNorm = 'norm_'
    else:
        figureNorm = ''
    plt.savefig(figureDir+'/'+names[targetSM]+'_'+names[mutantSM].lower()+'0_'+names[normSM].lower()+'0_'+figureNorm+figureOutput+'.png')
    
    return ax, cax
Esempio n. 4
0
def plotScatterNorm_ds2_bserr(data_aggPF, name, fullName):
    x = data_aggPF['sm_norm_diff_signals_2']['median']
    y = data_aggPF['sm_norm_diff_signals_2']['bserr'].apply(lambda x: float(x.split(',')[1][:-1]) - float(x.split(',')[0][1:]))
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=True)
    plotlib.setproperties(xlabel='Normalized differential signals', 
                          ylabel='Bootstrapped error', 
                          title=fullName,
                          labelfontsize=25, tickfontsize=25, equal=True)
    plt.savefig(figureDir+'/'+name+'_scatterNorm_ds2_bserr.png')
Esempio n. 5
0
def plotBindingCurve(affinityData, variant, annotate=True, ax=None):
    '''Plot a binding curve of a particular variant'''
    # Load data
    subSeries = affinityData.getVariantBindingSeries(variant)
    if len(subSeries) == 0:
        print 'No fluorescence data associated with variant %s' % str(variant)
        return
    concentrations = affinityData.x
    variant_table = affinityData.variant_table

    # Plot
    if ax is None:
        fig = plt.figure(figsize=(4, 4))
        ax = fig.add_subplot(111)
    plotting.plotFitCurve(concentrations,
                          subSeries,
                          variant_table.loc[variant],
                          ax=ax)

    plotlib.setproperties(xlabel='Concentration (nM)',
                          ylabel='Fluorescence',
                          labelfontsize=16,
                          tickfontsize=16)

    # Annonate
    if annotate:
        names = [
            'dG', 'dG_lb', 'dG_ub', 'fmax', 'fmax_lb', 'fmax_ub', 'numTests',
            'pvalue', 'rsq', 'flag'
        ]
        vec = pd.Series([
            processresults.getValueInTable(variant_table.loc[variant], name)
            for name in names
        ],
                        index=names)
        #vec.fillna('', inplace=True)
        annotationText = [
            'Kd = {:4.2f} uM ({:4.2f}, {:4.2f})'.format(
                liblib.dGtoKd(vec.dG, 'uM'), liblib.dGtoKd(vec.dG_lb, 'uM'),
                liblib.dGtoKd(vec.dG_ub, 'uM')),
            'fmax = {:4.2f} ({:4.2f}, {:4.2f})'.format(vec.fmax, vec.fmax_lb,
                                                       vec.fmax_ub),
            'Nclusters = {:4.0f}'.format(vec.numTests),
            'pvalue = {:.1e}'.format(vec.pvalue),
            'average Rsq = {:4.2f}'.format(vec.rsq),
            'fmax enforced = {}'.format(vec.flag)
        ]
        ax.annotate('\n'.join(annotationText),
                    xy=(0.05, .95),
                    xycoords='axes fraction',
                    horizontalalignment='left',
                    verticalalignment='top',
                    fontsize=11)

    return ax
Esempio n. 6
0
def plotScatterNorm_ds2_fbserr(data_aggPF, name, fullName):
    x = data_aggPF['sm_norm_diff_signals_2']['median']
    y = data_aggPF['sm_norm_diff_signals_2']['bserr'].apply(lambda x: float(x.split(',')[1][:-1]) - float(x.split(',')[0][1:])) 
    df = pd.concat([x, y / x], axis=1).replace([np.inf, -np.inf], np.nan).dropna()
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(df[0], df[1], alpha=0.7, log=True)
    plotlib.setproperties(xlabel='Normalized differential signals',
                          ylabel='Fractional bootstrapped error', 
                          title=fullName,
                          labelfontsize=25, tickfontsize=25, equal=True)
    plt.savefig(figureDir+'/'+name+'_scatterNorm_ds2_fbserr.png')
Esempio n. 7
0
def plotScatterNorm_QO_ds2(data_aggPF, name, fullName):
    x = data_aggPF['QO_norm_signals']['median']
    y = data_aggPF['sm_norm_diff_signals_2']['median']
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=True)
    plotlib.setproperties(xlim=(-0.09, 1), ylim=(-0.09, 1), 
                          xlabel='Normalized quenched signals', 
                          ylabel='Normalized differential signals 2', 
                          title=fullName,
                          labelfontsize=25, tickfontsize=25, equal=True)
    plt.savefig(figureDir+'/'+name+'_scatterNorm_QO_ds2.png')
Esempio n. 8
0
def plotScatterNorm_QO_sm_linear(data_aggPF, name, fullName):
    x = data_aggPF['quenched_norm']['median']
    y = data_aggPF['switch2_norm']['median']
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=False)
    plotlib.setproperties(xlim=(-0.09, 1), ylim=(-0.09, 1), 
                          xlabel='Normalized quenched signals', 
                          ylabel='Normalized switching signals', 
                          title=fullName,
                          labelfontsize=25, tickfontsize=25, equal=True)
    plt.savefig(figureDir+'/'+name+'_scatterNorm_QO_sm_linear.png')
Esempio n. 9
0
def plotConfusionMatrix(trueY, predictedY, catLabels=None, figsize=(8, 7)):
    fig = plt.figure(figsize=figsize)
    ax = sns.heatmap(confusion_matrix(trueY, predictedY), 
                     annot=True, square=True,
                     xticklabels=catLabels, yticklabels=catLabels)
    cax = fig.axes[-1]
    plotlib.setproperties(ax=ax, fontsize=15, yticklabelrot=0, 
                          xlabel='Predicted label', ylabel='True label')
    plotlib.setproperties(ax=cax, fontsize=15, yticklabelrot=0)

    return ax
Esempio n. 10
0
def plotScatter_QO_sm(data_aggPF, name, fullName):
    x = data_aggPF['QO_signals']['median']
    y = data_aggPF['sm_signals']['median']
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=True)
    ub = max(np.percentile(x, 99.9), np.percentile(y, 99.9)) * 1.1
    plotlib.setproperties(xlim=(0, ub), ylim=(0, ub), 
                          xlabel='Quenched signals', 
                          ylabel='Switching signals', 
                          title=fullName,
                          labelfontsize=25, tickfontsize=25, equal=True)
    plt.savefig(figureDir+'/'+name+'_scatter_QO_sm.png')
Esempio n. 11
0
def plotScatterNorm_ds2_bserr(data_aggPF, name, fullName):
    x = data_aggPF['sm_norm_diff_signals_2']['median']
    y = data_aggPF['sm_norm_diff_signals_2']['bserr'].apply(
        lambda x: float(x.split(',')[1][:-1]) - float(x.split(',')[0][1:]))
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=True)
    plotlib.setproperties(xlabel='Normalized differential signals',
                          ylabel='Bootstrapped error',
                          title=fullName,
                          labelfontsize=25,
                          tickfontsize=25,
                          equal=True)
    plt.savefig(figureDir + '/' + name + '_scatterNorm_ds2_bserr.png')
Esempio n. 12
0
def plotScatterNorm_QO_ds1(data_aggPF, name, fullName):
    x = data_aggPF['QO_norm_signals']['median']
    y = data_aggPF['sm_norm_diff_signals_1']['median']
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=True)
    plotlib.setproperties(xlim=(-0.09, 1),
                          ylim=(-0.09, 1),
                          xlabel='Normalized quenched signals',
                          ylabel='Normalized differential signals 1',
                          title=fullName,
                          labelfontsize=25,
                          tickfontsize=25,
                          equal=True)
    plt.savefig(figureDir + '/' + name + '_scatterNorm_QO_ds1.png')
Esempio n. 13
0
def plotProjection(results,
                   axis1=0,
                   axis2=1,
                   names_list=CN_globalVars.sm_names,
                   scolor_dict=CN_globalVars.scolors,
                   markers_dict=CN_globalVars.markers,
                   leaveSM=None,
                   leaveSM_results=None,
                   leaveSM_edgeColor='orange',
                   figsize=(6.8, 6.5),
                   axisLabelPrefix='',
                   title=None,
                   bbox_to_anchor=(1.13, 0.875)):
    fig = plt.figure(figsize=figsize)
    ax = plt.subplot(111)
    i = 0
    for currSM in names_list:
        if currSM != leaveSM:
            ax.scatter(results[i, axis1],
                       results[i, axis2],
                       color=scolor_dict[currSM],
                       marker=markers_dict[currSM],
                       label=currSM,
                       edgecolor='black',
                       linewidth=2,
                       s=120)
            i += 1
    if leaveSM:
        ax.scatter(leaveSM_results[0, axis1],
                   leaveSM_results[0, axis2],
                   color=scolor_dict[leaveSM],
                   marker=markers_dict[leaveSM],
                   label=leaveSM,
                   edgecolor=leaveSM_edgeColor,
                   linewidth=2,
                   s=120)
    plotlib.setproperties(
        xlabel=axisLabelPrefix + 'component {}'.format(axis1 + 1),
        ylabel=axisLabelPrefix + 'component {}'.format(axis2 + 1),
        title=title,
        labelfontsize=22,
        tickfontsize=22,
        symmetric=True,
        tight=False)
    ax.legend(bbox_to_anchor=bbox_to_anchor,
              bbox_transform=fig.transFigure,
              fontsize=14)

    return ax
Esempio n. 14
0
def plotScatter_QO_sm(data_aggPF, name, fullName):
    x = data_aggPF['QO_signals']['median']
    y = data_aggPF['sm_signals']['median']
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(x, y, alpha=0.7, log=True)
    ub = max(np.percentile(x, 99.9), np.percentile(y, 99.9)) * 1.1
    plotlib.setproperties(xlim=(0, ub),
                          ylim=(0, ub),
                          xlabel='Quenched signals',
                          ylabel='Switching signals',
                          title=fullName,
                          labelfontsize=25,
                          tickfontsize=25,
                          equal=True)
    plt.savefig(figureDir + '/' + name + '_scatter_QO_sm.png')
Esempio n. 15
0
def plotScatterNorm_ds2_fbserr(data_aggPF, name, fullName):
    x = data_aggPF['sm_norm_diff_signals_2']['median']
    y = data_aggPF['sm_norm_diff_signals_2']['bserr'].apply(
        lambda x: float(x.split(',')[1][:-1]) - float(x.split(',')[0][1:]))
    df = pd.concat([x, y / x], axis=1).replace([np.inf, -np.inf],
                                               np.nan).dropna()
    plt.figure(figsize=(7, 7))
    plotlib.scatterDensity(df[0], df[1], alpha=0.7, log=True)
    plotlib.setproperties(xlabel='Normalized differential signals',
                          ylabel='Fractional bootstrapped error',
                          title=fullName,
                          labelfontsize=25,
                          tickfontsize=25,
                          equal=True)
    plt.savefig(figureDir + '/' + name + '_scatterNorm_ds2_fbserr.png')
Esempio n. 16
0
def plotBindingCurvesAcrossTargets(affinityDataList, variant, 
                                  colors=None, names=None, norm=False, ax=None):
    '''Plot a binding curve of a particular variant'''

    if colors is None:
        colors = sns.color_palette("Paired", 12)

    if ax is None:
        fig = plt.figure(figsize=(4, 4))
        ax = fig.add_subplot(111)

    for i, affinityData in enumerate(affinityDataList):
        
        # Load data
        subSeries = affinityData.getVariantBindingSeries(variant)
        if len(subSeries)==0:
            print 'No fluorescence data associated with variant %s'%str(variant)
            return
        concentrations = affinityData.x
        variant_table = affinityData.variant_table
        variant_data = variant_table.loc[variant]

        if norm:
            fmax = variant_data['fmax']
            subSeries = subSeries.copy() / fmax
            variant_data = variant_data.copy()
            for field in ['fmax_init', 'fmin_init', 
                          'fmax_lb', 'fmax', 'fmax_ub', 
                          'fmin_lb', 'fmin', 'fmin_ub']:
                variant_data[field] = variant_data[field] / fmax
        
        # Plot
        plotting.plotFitCurve(concentrations, subSeries, variant_data, ax=ax)
        
        ax.lines[i*4+3].set_color(colors[i])
        ax.lines[i*4+3].set_linewidth(2)
        if names is not None:
            ax.lines[i*4+3].set_label(names[i])
    
    if norm:
        ylabel = 'Normalized fluorescence'
    else:
        ylabel = 'Fluorescence'
    plotlib.setproperties(xlabel='Concentration (nM)', ylabel=ylabel, 
                          labelfontsize=16, tickfontsize=16, 
                          legend=names, legendloc=2, legendfontsize=12)

    return ax
Esempio n. 17
0
def plotConfusionMatrix(trueY, predictedY, catLabels=None, figsize=(8, 7)):
    fig = plt.figure(figsize=figsize)
    ax = sns.heatmap(confusion_matrix(trueY, predictedY),
                     annot=True,
                     square=True,
                     xticklabels=catLabels,
                     yticklabels=catLabels)
    cax = fig.axes[-1]
    plotlib.setproperties(ax=ax,
                          fontsize=15,
                          yticklabelrot=0,
                          xlabel='Predicted label',
                          ylabel='True label')
    plotlib.setproperties(ax=cax, fontsize=15, yticklabelrot=0)

    return ax
Esempio n. 18
0
def plotBindingCurve(affinityData, variant, annotate=True, ax=None):
    '''Plot a binding curve of a particular variant'''
    # Load data
    subSeries = affinityData.getVariantBindingSeries(variant)
    if len(subSeries)==0:
        print 'No fluorescence data associated with variant %s'%str(variant)
        return
    concentrations = affinityData.x
    variant_table = affinityData.variant_table
    
    # Plot
    if ax is None:
        fig = plt.figure(figsize=(4, 4))
        ax = fig.add_subplot(111)
    plotting.plotFitCurve(concentrations, subSeries, variant_table.loc[variant], ax=ax)

    plotlib.setproperties(xlabel='Concentration (nM)', ylabel='Fluorescence', 
                          labelfontsize=16, tickfontsize=16)

    # Annonate
    if annotate:
        names = ['dG', 'dG_lb', 'dG_ub', 'fmax', 'fmax_lb', 'fmax_ub', 'numTests', 'pvalue', 'rsq', 'flag']
        vec = pd.Series([processresults.getValueInTable(variant_table.loc[variant], name) for name in names], index=names)
            #vec.fillna('', inplace=True)
        annotationText = ['Kd = {:4.2f} uM ({:4.2f}, {:4.2f})'.format(liblib.dGtoKd(vec.dG, 'uM'),
                                                                   liblib.dGtoKd(vec.dG_lb, 'uM'),
                                                                   liblib.dGtoKd(vec.dG_ub, 'uM')),
                          'fmax = {:4.2f} ({:4.2f}, {:4.2f})'.format(vec.fmax,
                                                                     vec.fmax_lb,
                                                                     vec.fmax_ub),
                          'Nclusters = {:4.0f}'.format(vec.numTests),
                          'pvalue = {:.1e}'.format(vec.pvalue),
                          'average Rsq = {:4.2f}'.format(vec.rsq),
                          'fmax enforced = {}'.format(vec.flag)
                          ]
        ax.annotate('\n'.join(annotationText), xy=(0.05, .95), xycoords='axes fraction',
                    horizontalalignment='left', verticalalignment='top', fontsize=11)

    return ax
Esempio n. 19
0
def doubleMutant(allData_aggPF,
                 mutantSM,
                 targetSM,
                 normSM,
                 names,
                 norm=False,
                 coop=False):
    # Define variables
    data = allData_aggPF[targetSM]['sm_norm_diff_signals_2']['median']
    mutantRefVariant = allData_aggPF[mutantSM]['sm_norm_diff_signals_2'][
        'median'].idxmax()
    targetRefVariant = allData_aggPF[targetSM]['sm_norm_diff_signals_2'][
        'median'].idxmax()
    normRefVariant = allData_aggPF[normSM]['sm_norm_diff_signals_2'][
        'median'].idxmax()
    if norm:
        targetRefSignal = allData_aggPF[targetSM]['sm_norm_diff_signals_2'][
            'median'][targetRefVariant]
        normRefSignal = allData_aggPF[normSM]['sm_norm_diff_signals_2'][
            'median'][normRefVariant]
    else:
        targetRefSignal = 1
        normRefSignal = 1
    libSeq = 'NNGGATTTTCCNNNNACGAAGTNNTCCCGAG'
    startPos = 14
    title = 'Mutants of ' + names[mutantSM].lower(
    ) + '0, in the presence of ' + names[targetSM]
    if norm and coop:
        cbarLabel = 'Cooperativity normalized to ' + names[targetSM].lower(
        ) + '0'
    elif norm and not coop:
        cbarLabel = 'Differential signals normalized to ' + names[
            targetSM].lower() + '0'
    elif not norm and coop:
        cbarLabel = 'Cooperativity'
    else:
        cbarLabel = 'Differential signals'

    # Compute vmin and vmax manually (assuming robust=True) so that the color bar
    # scale is the same across the same dataRefVariant
    normRefData = allData_aggPF[normSM]['sm_norm_diff_signals_2'][
        'median'] / normRefSignal
    doubleMutantSignals, mutantLabels = plotlib.doubleMutantMatrix(
        normRefData, normRefVariant, libSeq, startPos, coop)
    doubleMutantSignals = doubleMutantSignals[~np.isnan(doubleMutantSignals)]
    vmin = np.percentile(doubleMutantSignals, 1)
    vmax = np.percentile(doubleMutantSignals, 99)
    vlim = max(abs(vmin), abs(vmax))
    vmin, vmax = -vlim, vlim

    # Make heatmap
    plt.figure(figsize=(12, 10))
    ax, cax = plotlib.doubleMutant(data,
                                   mutantRefVariant,
                                   libSeq,
                                   startPos=startPos,
                                   refSignal=targetRefSignal,
                                   normToRefSignal=norm,
                                   coop=coop,
                                   vmin=vmin,
                                   vmax=vmax,
                                   cbarLabel=cbarLabel,
                                   triangle='lower',
                                   invertY=False,
                                   linewidth=3)
    cax.tick_params(labelsize=20)
    cax.yaxis.label.set_fontsize(20)
    plotlib.setproperties(title=title, labelfontsize=20, titlefontsize=20)

    # Save to file
    if coop:
        figureOutput = 'coop'
    else:
        figureOutput = 'doubleMutant'
    if norm:
        figureNorm = 'norm_'
    else:
        figureNorm = ''
    plt.savefig(figureDir + '/' + names[targetSM] + '_' +
                names[mutantSM].lower() + '0_' + names[normSM].lower() + '0_' +
                figureNorm + figureOutput + '.png')

    return ax, cax