Richard Hsia - 4 months ago 61

Python Question

I'm trying to fit a Gaussian for my data (which is already a rough gaussian). I've already taken the advice of those here and tried

`curve_fit`

`leastsq`

Here's a look at the script I have so far

`import pylab as plb`

import matplotlib.pyplot as plt

# Read in data -- first 2 rows are header in this example.

data = plb.loadtxt('part 2.csv', skiprows=2, delimiter=',')

x = data[:,2]

y = data[:,3]

mean = sum(x*y)

sigma = sum(y*(x - mean)**2)

def gauss_function(x, a, x0, sigma):

return a*np.exp(-(x-x0)**2/(2*sigma**2))

popt, pcov = curve_fit(gauss_function, x, y, p0 = [1, mean, sigma])

plt.plot(x, gauss_function(x, *popt), label='fit')

# plot data

plt.plot(x, y,'b')

# Add some axis labels

plt.legend()

plt.title('Fig. 3 - Fit for Time Constant')

plt.xlabel('Time (s)')

plt.ylabel('Voltage (V)')

plt.show()

What I get from this is a gaussian-ish shape which is my original data, and a straight horizontal line.

Also, I'd like to plot my graph using points, instead of having them connected.

Any input is appreciated!

Answer

**Here is corrected code:**

```
import pylab as plb
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
x = ar(range(10))
y = ar([0,1,2,3,4,5,4,3,2,1])
n = len(x) #the number of data
mean = sum(x*y)/n #note this correction
sigma = sum(y*(x-mean)**2)/n #note this correction
def gaus(x,a,x0,sigma):
return a*exp(-(x-x0)**2/(2*sigma**2))
popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma])
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
plt.title('Fig. 3 - Fit for Time Constant')
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.show()
```

**result:**

Source (Stackoverflow)

Comments