Un-normalized Gaussian curve on histogram

前端 未结 3 1261
广开言路
广开言路 2021-01-05 14:13

I have data which is of the gaussian form when plotted as histogram. I want to plot a gaussian curve on top of the histogram to see how good the data is. I am using pyplot f

相关标签:
3条回答
  • 2021-01-05 14:29

    An old post I know, but wanted to contribute my code for doing this, which simply does the 'fix by area' trick:

    from scipy.stats import norm
    from numpy import linspace
    from pylab import plot,show,hist
    
    def PlotHistNorm(data, log=False):
        # distribution fitting
        param = norm.fit(data) 
        mean = param[0]
        sd = param[1]
    
        #Set large limits
        xlims = [-6*sd+mean, 6*sd+mean]
    
        #Plot histogram
        histdata = hist(data,bins=12,alpha=.3,log=log)
    
        #Generate X points
        x = linspace(xlims[0],xlims[1],500)
    
        #Get Y points via Normal PDF with fitted parameters
        pdf_fitted = norm.pdf(x,loc=mean,scale=sd)
    
        #Get histogram data, in this case bin edges
        xh = [0.5 * (histdata[1][r] + histdata[1][r+1]) for r in xrange(len(histdata[1])-1)]
    
        #Get bin width from this
        binwidth = (max(xh) - min(xh)) / len(histdata[1])           
    
        #Scale the fitted PDF by area of the histogram
        pdf_fitted = pdf_fitted * (len(data) * binwidth)
    
        #Plot PDF
        plot(x,pdf_fitted,'r-')
    
    0 讨论(0)
  • 2021-01-05 14:40

    Another way of doing this is to find the normalized fit and multiply the normal distribution with (bin_width*total length of data)

    this will un-normalize your normal distribution

    0 讨论(0)
  • 2021-01-05 14:54

    As an example:

    import pylab as py
    import numpy as np
    from scipy import optimize
    
    # Generate a 
    y = np.random.standard_normal(10000)
    data = py.hist(y, bins = 100)
    
    # Equation for Gaussian
    def f(x, a, b, c):
        return a * py.exp(-(x - b)**2.0 / (2 * c**2))
    
    # Generate data from bins as a set of points 
    x = [0.5 * (data[1][i] + data[1][i+1]) for i in xrange(len(data[1])-1)]
    y = data[0]
    
    popt, pcov = optimize.curve_fit(f, x, y)
    
    x_fit = py.linspace(x[0], x[-1], 100)
    y_fit = f(x_fit, *popt)
    
    plot(x_fit, y_fit, lw=4, color="r")
    

    enter image description here

    This will fit a Gaussian plot to a distribution, you should use the pcov to give a quantitative number for how good the fit is.

    A better way to determine how well your data is Gaussian, or any distribution is the Pearson chi-squared test. It takes some practise to understand but it is a very powerful tool.

    0 讨论(0)
提交回复
热议问题