2013-07-22 38 views
5

Tôi có dữ liệu có dạng gaussian khi được vẽ như biểu đồ. Tôi muốn vẽ một đường cong gaussian trên đầu trang của biểu đồ để xem dữ liệu tốt như thế nào. Tôi đang sử dụng pyplot từ matplotlib. Ngoài ra tôi KHÔNG muốn bình thường hóa biểu đồ. Tôi có thể làm phù hợp với tiêu chuẩn, nhưng tôi đang tìm kiếm một sự phù hợp không chuẩn hóa. Có ai ở đây biết làm thế nào để làm điều đó?Đường cong Gaussian chưa chuẩn hóa trên biểu đồ

Cảm ơn! Abhinav Kumar

+0

Ví dụ này có giúp ích không? http://matplotlib.org/examples/api/histogram_demo.html – DMH

+0

Không, về cơ bản những gì tôi không muốn. Tôi không muốn bình thường hóa. –

Trả lời

6

Như một ví dụ:

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

này sẽ phù hợp với một âm mưu Gaussian với phân phối, bạn nên sử dụng pcov để đưa ra một số định lượng cho như thế nào tốt phù hợp là.

Cách tốt hơn để xác định dữ liệu của bạn là Gaussian tốt như thế nào hoặc bất kỳ phân phối nào là Pearson chi-squared test. Phải mất một số thực hành để hiểu nhưng nó là một công cụ rất mạnh mẽ.

+0

Chúng tôi có thể truy xuất a, b và c cho phù hợp với bạn hiển thị ở trên không? Tôi muốn kiểm tra với những gì tôi mong đợi nó được. –

+0

Đây chính là 'popt'. Bạn sẽ nhận thấy trong việc 'y_fit' tôi đã thực hiện' f (x_fit, * popt) 'đây là một thủ thuật để giải nén tuple của' popt' vào các đối số của 'f'. Xem tài liệu để biết thêm. – Greg

3

Một cách khác để làm điều này là để tìm thấy những phù hợp bình thường và nhân phân phối chuẩn với (bin_width * Tổng chiều dài của dữ liệu)

này sẽ bỏ bình thường phân bố bình thường của bạn

4

Một bài cũ tôi biết , nhưng muốn đóng góp mã của tôi để thực hiện việc này, chỉ cần thực hiện mẹo 'sửa theo khu vực':

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-') 
Các vấn đề liên quan