1

所以我有 3 个分数列表,我使用直方图来显示每个分数出现的频率。问题是每个都有 100000 个,我需要将 y 值减少这么多才能获得频率百分比。这是我现在的代码

bins = numpy.linspace(0, 1, 50)

z = np.linspace(0,1,50)
g = (lambda z: 2 * np.exp((-2)*(z**2)*(1000000000)))
w = g(z)
plt.plot(z,w)

pyplot.hist(Vrand, bins, alpha=0.5)
pyplot.hist(Vfirst, bins, alpha=0.5)
pyplot.hist(Vmin, bins, alpha=0.2)
pyplot.show()

这是我需要 y 轴除以 100000 的最后一段代码

更新:当我尝试使用 np 直方图除以 100000 时,所有值 = 0,除了上面的行

bins = numpy.linspace(0, 1, 50)

z = np.linspace(0,1,50)
g = (lambda z: 2 * np.exp((-2)*(z**2)*(100000)))
w = g(z)
plt.plot(z,w)

hist, bins = np.histogram(Vrand, bins)
hist /= 100000.0
widths = np.diff(bins)
pyplot.bar(bins[:-1], hist, widths)
4

2 回答 2

4

matplotlib 直方图有一个“规范”参数,您可以使用它来将所有内容缩放到[0,1]间隔

pyplot.hist(Vrand, bins, normed=1)

或使用weights参数按不同的系数对其进行缩放。

您还可以使用 numpy 的重新调整值histogram并根据需要对其进行缩放(在 python 3.x 中测试)

hist, bins = np.histogram(Vrand, bins)
hist /= 100000.0
widths = np.diff(bins)
pyplot.bar(bins[:-1], hist, widths)

在我看来,前两个解决方案更好,因为我们不应该“重新发明轮子”并手动实现库中已经完成的工作。

于 2013-09-10T06:39:32.150 回答
1

首先,我建议您考虑一下您的风格,使用其中一种pltpyplot两种都不使用,并且您应该在示例代码中包含一些虚假数据来说明问题和您的导入。

因此,问题在于,在以下示例中,计数非常大:

bins = np.linspace(0, 1, 50)
data = np.random.normal(0.5, 0.1, size=100000)

plt.hist(data, bins)
plt.show()

在此处输入图像描述

您尝试通过将 bin 计数除以整数来解决此问题:

hist, bins = plt.histogram(data, bins)
hist_divided = hist/10000

这里的问题是 hist 是一个int's 的数组,除法整数很棘手。例如

>>> 2/3
0
>>> 3/2
1

0如果您选择的值太大而无法除以,这就是给您一行's 的原因。相反,您可以按照@lejlot 的建议除以浮点数,注意您需要除以10000.0and not 10000

或者@lejlot 提出的其他建议只是normed在调用“hist”时使用参数。这会重新调整所有 numbs 的hist大小,使其平方和为1,在比较值时非常有用。

我还注意到您似乎遇到了这个问题,因为您在与直方图相同的轴上绘制线图,如果此线图超出[0,1]范围,您将再次遇到相同的问题,而不是重新调整直方图轴,您应该孪生x 轴

于 2013-09-10T10:24:48.717 回答