直方图未显示在f分布图中

Bey*_*yza 5 python statistics distribution matplotlib

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

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
Run Code Online (Sandbox Code Playgroud)

这是情节的样子:

具有小df值的F分布图 具有小df值的F分布图

具有大df值的F分布图 具有大df值的F分布图

Imp*_*est 0

问题是 adfd为 1 的 f 分布向大数方向极大地扩散。假设您的 array 中有 2000 左右的值x,但只有 50 个介于 0 和 2000 之间的 bin。这使得 bin 相当大,因此高度相当低。我认为,如果您无论如何想将视图限制为某个较低的数字,最好也将直方图限制为该数字。

在下面的代码中,限制为 5,bin 宽度为 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述