我正在python中创建一个直方图,我希望bin边是给定值的百分比(5-10%)。最好的方法是什么,这样我就不会在bin边界上留下间隙,也不需要为bin边界计算预先设置一些值?
发布于 2012-09-08 01:18:40
一般来说,使用像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. ])...Or,在需要预定义存储箱(可能具有不同宽度)的奇数情况下,您可以自己指定存储箱边缘(有关如何工作的信息,请阅读文档):
>>> 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边缘;我将其留在此处只是为了说明需要注意的事项)
顺便说一句,如上定义的仓位边缘也将创建超出您所需范围的中间仓位。例如,如果您将1、2和3的+/- 10%内的项目放入箱中,那么本质上,在2.2和2.7 (所需箱的“外边”)之间也会有一个箱,而像2.5这样的数字将放在那里。如果在所需的存储箱之间存在值,则可能需要相应地调整截止点或可视化。
发布于 2012-09-07 22:50:18
也许我把你的问题过于简单化了?
def bins(data, nbins):
range = max(data) - min(data)
binsize = range / float(nbins)
bins = [x * binsize for x in range(nbins)]https://stackoverflow.com/questions/12320395
复制相似问题