直方图未显示在 f 分布图中
Histogram does not show up in f-distribution plot
我正在尝试创建具有给定自由度 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
情节是这样的:
具有小 df 值的 F 分布图
具有大 df 值的 F 分布图
问题在于,dfd
为 1 的 f 分布向大量分布。因此,假设您的数组 x
中有 2000 左右的值,但在 0 和 2000 之间只有 50 个 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()
我正在尝试创建具有给定自由度 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
情节是这样的:
问题在于,dfd
为 1 的 f 分布向大量分布。因此,假设您的数组 x
中有 2000 左右的值,但在 0 和 2000 之间只有 50 个 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()