带有箱子的直方图百分比值?

时间:2012-09-07 14:46:32

标签: python algorithm histogram

我在python中创建直方图,我希望bin边缘是给定值的百分比(5-10%)。最好的方法是什么,这样我就不会在bin边界留下空隙,而且不必为bin边界计算预先设置一些值?

2 个答案:

答案 0 :(得分:1)

一般来说,使用numpy.histogram之类的预定义工具创建直方图很方便,尽管你新发布的评论表明你正在使用matplotlib-也完全没问题。无论哪种方式,您都可以创建一组自动确定的宽度相等的容器......

import numpy
data = [0,1,1,1,1,1,1,2,3,3]
hist, edges = numpy.histogram( data , bins = 10)
>>> hist
array([1, 0, 0, 6, 0, 0, 1, 0, 0, 2])
>>> edges
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8,  2.1,  2.4,  2.7,  3. ])

...或者,在您想要预定义分档(可能具有不同宽度)的奇怪情况下,您可以自己指定分档边缘(请阅读文档以获取有关其工作原理的信息):

>>> hist, edges = numpy.histogram( data , bins = [0,.5,1., 1.5,2,3])
>>> hist 
array([1, 0, 6, 0, 3])
>>> edges
array([ 0. ,  0.5,  1. ,  1.5,  2. ,  3. ])
>>> 

然而,要小心使用截然不同的纸槽尺寸。在许多情况下,这种粗粒度可能会扭曲您想要比较的数字之间的关系。

至于你的价值+/- 10%边界?

preferred_bin_centers = [0,1,2,3]
bin_pairs = [ ( 0.9* v , 1.1*v ) for v in preferred_bin_centers ]
>>> [[0.0, 0.0], [0.9, 1.1], [1.8, 2.2], [2.7, 3.3000000000000003]]

或者,扁平化为可以由numpy.histogram ...

使用的列表形式
bin_edges = sum( [  [ 0.9* v , 1.1*v ]  for v in values ]    , [] )

>>> [0.0, 0.0, 0.9, 1.1, 1.8, 2.2, 2.7, 3.3000000000000003]

(请注意上面列表的前两项,如果您的某个bin中心为0,此代码会给出令人困惑的bin边缘;我将其留作仅作为需要注意的示例)

顺便提一下,如上定义的bin边缘也会创建超出所需范围的中间bin。例如,如果您将项目分别在1,2和3的+/- 10%范围内,那么本身就会有一个介于2.2和2.7之间的区间(所需区间的“外边缘”),其中数字如2.5走。如果您在所需的垃圾箱之间存在值,则可能需要相应地调整截止值或可视化。

答案 1 :(得分:0)

也许我过分简化了你的问题?

def bins(data, nbins):
    range = max(data) - min(data)
    binsize = range / float(nbins)
    bins = [x * binsize for x in range(nbins)]