2013-10-21 67 views
6

如何创建一个直方图,该直方图显示给定的数组x从0到1范围内的概率分布?我期望每个栏是< = 1,如果我总结每个栏的y值,他们应该加起来为1.如何绘制python中的概率质量函数

例如,如果x = [.2,.2,.8],那么我会期望一个图表显示2条,一条在.2处,高度为0.66,一条在0.8处,高度为0.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

回答

3

我认为我的原始术语是关闭的。我有一组连续值[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

你能解释为什么这部分是必要的吗? bins = bins [: - 1] +(bins [1] - bins [0])/ 2 – user3314418

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 =和我正在寻找与两个杆,一个在0.2的曲线图[2,0.2,0.8。]高度为.66,因为66%的数值在.2和一个在0.8的高度为0.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为离散时才有效,并且只采用一组有限的固定值,这些值彼此分开。

+0

也许我的术语是关闭的。如果x = [。2,.2,.8],我正在寻找一个带有两个小节的图形,一个是.2,高度为0.66,因为66%的值是.2,一个是0.8。高度.33,该图表会被调用什么,以及如何生成该图表? – kmosley

+0

什么是您的数据来源?它是来自连续信号还是离散事件? – Hooked

+0

这是一个连续的信号,我想离散化,这样我就可以查看条形图并说出“0.2左右的值大概发生x%的时间”。 – kmosley