Feb-17-2021, 12:03 PM
I am trying to plot a simple curve in Python using matplotlib with a Gaussian fit which has both x and y errors. The best fit curve should take into account both errors. I have also built in a way of ignoring the baseline and to isolate the data to only a certain x range. My main issue is that I cant manage to get the Scipy ODR to work. It is reporting the wrong number of parameters (see in code comments). I know the lingress line is incorrect as this was taken from a straight line fir ODR but not sure what to put there. Any help would be appreciated. I will paste the full Python code below and see if I can upload the data file. I may have other issues once the parameters issue is solved! Thanks.
Here is the data file if it works - CSV DATA FILE
Here is the data file if it works - CSV DATA FILE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
% matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import odr from scipy.stats import linregress # These two lines enable formatted printing of Pandas DataFrames from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" def GaussModelConstant(x, a, x0, sigma, const): y_gauss = a * np.exp( - (x - x0) * * 2 / ( 2 * sigma * * 2 )) + const return y_gauss # change the filename below as required results = pd.read_csv( 'result-calibration.csv' , skip_blank_lines = True , skipinitialspace = True ) results.head() x = results[ 'Channel' ][ 260 : 280 ] y = results[ 'Counts' ][ 260 : 280 ] results[ 'Counts_Error' ] = np.sqrt((results[ 'Counts' ])) xerror = 0.5 yerror = results[ 'Counts_Error' ][ 260 : 280 ] model = odr.Model(GaussModelConstant) rdata = odr.RealData(x, y, sx = xerror, sy = yerror) # This line doesnt seem right I have tried replacing with the one below which I need to add somewhere? #p0 = [1400, 270, 10, 200] init_guess = linregress(x, y)[ 0 : 2 ] # Get error when I run - TypeError: GaussModelConstant() missing 3 required positional arguments: 'x0', 'sigma', and 'const' odr = odr.ODR(rdata, model, beta0 = init_guess) result_outputs = odr.run() popt = result_outputs.beta perr = np.sqrt(np.diag(result_outputs.cov_beta)) a_fit = popt[ 0 ] x0_fit = popt[ 1 ] sigma_fit = popt[ 2 ] const_fit = popt[ 3 ] perr = np.sqrt(np.diag(pcov)) a_err = perr[ 0 ] x0_err = perr[ 1 ] sigma_err = perr[ 2 ] const_err = perr[ 3 ] print ( 'fit parameters with error estimates' ) print ( '***************************************************' ) print ( f 'A = {a_fit: .3g} +/- {a_err: .3g}' ) print ( f 'x0 = {x0_fit: .3g} +/- {x0_err: .3g}' ) print ( f 'sigma = {sigma_fit: .3g} +/- {sigma_err: .3g}' ) print ( f 'Constant \'base\' offset = {const_fit: .3g} +/- {const_err: .3g}' ) print ( '***************************************************' ) plt.figure(figsize = ( 15 , 15 )) plt.errorbar(x, y, yerr = yerror, xerr = xerror, fmt = 'o' , ecolor = 'k' , label = 'Errors' ) plt.plot(x, GaussModelConstant(x, * popt), color = "red" ) |