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