如何创建一个直方图,显示给定数字x的范围为0-1的概率分布?我希望每个柱都是< = 1,如果我将每个柱的y值相加,它们应该加起来为1.
例如,如果x = [。2,.2,.8],那么我希望图表显示2个条形图,一个在.2处,高度为.66,一个在.8处,高度为.33。
我试过了:
matplotlib.pyplot.hist(x, bins=50, normed=True)
给了我一个直方图,条形图高于1.我不是说那是错的,因为这是规范参数根据文档做的,但是没有显示概率。
我也试过了:
counts, bins = numpy.histogram(x, bins=50, density=True)
bins = bins[:-1] + (bins[1] - bins[0])/2
matplotlib.pyplot.bar(bins, counts, 1.0/50)
这也给了我的y值总和大于1的条。
答案 0 :(得分:5)
我认为我原来的术语是关闭的。我有一个连续值[0-1]的数组,我想离散并用于绘制概率质量函数。我认为这可能足以保证采用单一方法。
以下是代码:
x = [random.random() for r in xrange(1000)]
num_bins = 50
counts, bins = np.histogram(x, bins=num_bins)
bins = bins[:-1] + (bins[1] - bins[0])/2
probs = counts/float(counts.sum())
print probs.sum() # 1.0
plt.bar(bins, probs, 1.0/num_bins)
plt.show()
答案 1 :(得分:3)
我认为您错误地将总和视为积分。适当的PRF(概率分布函数)积分为统一;如果你只是拿出你可能会错过矩形大小的总和。
import numpy as np
import pylab as plt
N = 10**5
X = np.random.normal(size=N)
counts, bins = np.histogram(X,bins=50, density=True)
bins = bins[:-1] + (bins[1] - bins[0])/2
print np.trapz(counts, bins)
给予.999985
,这足够接近统一。
编辑:回复以下评论:
如果x = [。2,.2,.8]并且我正在寻找一个带有两个条形的图形,一个是.2,高度为.66,因为66%的值为.2,一个条形为.8高度为.33,该图表将被调用以及如何生成它?
以下代码:
from collections import Counter
x = [.2,.2,.8]
C = Counter(x)
total = float(sum(C.values()))
for key in C: C[key] /= total
提供“字典”C=Counter({0.2: 0.666666, 0.8: 0.333333})
。从这里可以构建一个条形图,但这只有在PDF 离散时才有效,并且只采用一组彼此完全分离的有限固定值。