2

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

4

2 回答 2

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. ])
>>> 

但是,请注意使用截然不同的 bin 大小。在许多情况下,这种粗粒度可能会扭曲您尝试比较的数字之间的关系。

至于你的价值 +/-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 之类的数字会去。如果在所需的 bin 之间存在值,则可能需要相应地调整截止值或可视化。

于 2012-09-07T17:18:39.713 回答
0

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

def bins(data, nbins):
    range = max(data) - min(data)
    binsize = range / float(nbins)
    bins = [x * binsize for x in range(nbins)]
于 2012-09-07T14:50:18.017 回答