# -*- coding: utf-8 -*- """ Created on Fri Apr 24 16:47:17 2020 Author: Ian Morgan email: ilmorgan@ucsb.edu """ import matplotlib.pyplot as plt import pandas as pd from uncertainties import unumpy as unp from uncertainties import ufloat from functions.fitting import WLC,FJC,modelfunc import plotting # initializes style defaults for plotting plotting.init() if __name__ == '__main__': # Load in data data = pd.read_csv('../data/Fig3data_04-22-2020.csv') # set index for polymer and relaxation data.set_index(['polymer','relaxation']) # Monotonically increasing f2s data = data.sort_values(by='fbar_mean') # Load in bbarN into unumpy array to handle uncertainties bbarN = unp.uarray(data['bbarN_mean'],data['bbarN_std']) # setup plot fig,ax = plt.subplots(nrows=2,ncols=3,dpi=600,gridspec_kw = {'wspace':0.3,'height_ratios':(1,4)}) fig.set_size_inches(7,2.5) fig.subplots_adjust(left=0.09,right=0.98,bottom=0.16,top = 0.95) # list of lc,ls (coil contour length, structured contour length) table = [(3,1.1),(3,1.5),(3,2.0)] fits = pd.read_csv('../data/WLC_FJC_elasticity_fits_04-27-2020.csv') for i,(lc,ls) in enumerate(table): # maximum compaction length alpha_c = lc-ls # Scaling of compaction length scale = lc*WLC(data['f2_pN'],0.8)-ls*FJC(data['f2_pN'],ls) # new bbar bbar = bbarN*alpha_c/scale data['bbar_FJC_mean'] = unp.nominal_values(bbar) data['bbar_FJC_std'] = unp.std_devs(bbar) # Previously, I was testing with just the least-squares fit which gives errors that are too small #popt,stderr,chi2,residual = fit_curvefit(data['fbar_mean'],data['bbar_FJC_mean'],data['bbar_FJC_std'],fitfunc) #rho = ufloat(popt[0],stderr[0]) # Load in mean and standard deviation of fits from bootstrapping rho = ufloat(fits['rho'].loc[i],fits['rho_err'].loc[i]) # Best-fit y-values data['bbar_FJC_fit'] = modelfunc(data['fbar_mean'],rho.n) # standardized residuals data['res_FJC'] = (data['bbar_FJC_mean'] - data['bbar_FJC_fit'])/data['bbar_FJC_std'] # chi squared on fit chi2 = fits['chi2'].loc[i] # Make the elements of the plot ax[0,i].plot('fbar_mean','res_FJC','o',data=data,ms=1.5) ax[0,i].axhline(0,color='k',lw=0.5) ax[1,i].errorbar('fbar_mean','bbar_FJC_mean','bbar_FJC_std',data=data, fmt ='o', ms = 1.5, elinewidth = 1, ecolor = 'grey') ax[1,i].plot('fbar_mean','bbar_FJC_fit',data=data,c='C1') ax[1,i].axhline(0,color='k',lw=0.5) ax[1,i].set_xlabel(r"$\bar{f}$") ax[0,i].set_xticks([]) ax[0,i].set_yticks([-15,0,15]) ax[0,i].set_ylim(-15,15) # Write text on plot with fit values text = "$l_c = %s, l_s = %s$\n$\\rho = %.3f\pm%.3f$\n$\chi^2 = %.1f$"%(lc,ls,rho.n,rho.std_dev,chi2) ax[1,i].text(0.3,0.1,text,transform=ax[1,i].transAxes) ax[1,0].set_ylabel(r"$\bar{b}$") ax[0,0].set_ylabel(r"$\Delta\bar{b}/\sigma_{\bar{b}}$") # Save figure plt.savefig('../figures/SIFig9.pdf')