2017-07-15 31 views
3

我正在尝试创建具有给定自由度d1和d2的f分布随机数,并绘制两个直方图与f分布的随机数,并绘制理想化的f-分布曲线,但是当我给df的小值时,直方图不显示。我是统计学和matplotlib的新手,我无法弄清楚如何处理这个问题。 这是我的代码:直方图不显示在f分布图中

def distF(request, distribution_id): 
    dist = get_object_or_404(Distribution, pk=distribution_id) 
    dfd = dist.var4 
    dfn = dist.var2 
    x = np.random.f(dfn, dfd, size = dist.var3) 
    num_bins = 50 

    fig, ax = plt.subplots() 
    print(x) 
    # the histogram of the data 
    n, bins, patches = ax.hist(x, num_bins, normed=True) 
    y = np.linspace(0, 5, 1001)[1:] 
    dist = st.f(dfn, dfd, 0) 
    #y = np.linspace(st.f.ppf(0.01, dfn, dfd), st.f.ppf(0.99, dfn, dfd), 100) 
    ax.plot(y, dist.pdf(y), '--') 

    ax.set_xlabel('Smarts') 
    ax.set_ylabel('Probability density') 
    ax.set_xlim([0, 4]) 
    ax.set_ylim([0, 3]) 
    fig.tight_layout() 
    canvas = FigureCanvas(fig) 
    response = HttpResponse(content_type='image/png') 
    canvas.print_png(response) 
    plt.close(fig) 
    return response 

这是图什么样子:

F-distribution plot with small df values F-分布图与小DF值

F-distribution plot with large df values 大的DF值

F-分布图

回答

0

问题是f分布的dfd为1对于大数目分布极大。因此,假设您的数组x中的值为2000左右,但在0和2000之间只有50个分档。这使得分档箱相当大,因此高度相当低。我会认为,如果你无论如何都想限制你的观点为低的数字,最好也将直方图限制在这个数字。

在下面的代码中,限制为5,垃圾箱宽度为0.2。

import numpy as np 
import scipy.stats as st 
import matplotlib.pyplot as plt 

dfn = 10 
dfd =1 
limit = 5 

x = np.random.f(dfn, dfd, size = 100) 
bins = np.arange(0, limit, 0.2) 

fig, ax = plt.subplots() 

# the histogram of the data 
n, bins, patches = ax.hist(x, bins, normed=True) 
y = np.linspace(0, limit, 1001)[1:] 
dist = st.f(dfn, dfd, 0) 

ax.plot(y, dist.pdf(y), '--') 

ax.set_xlabel('Smarts') 
ax.set_ylabel('Probability density') 
ax.set_xlim([0, limit]) 

fig.tight_layout() 
plt.show() 

enter image description here