繁体   English   中英

带有柱状图的直方图值的百分比?

[英]Histogram with bins a percentage of values?

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

通常,使用诸如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边缘;我仅将其留作了注意事项的示例)

顺便说一句,上面定义的垃圾箱边缘也会在所需范围之外创建中间垃圾箱。 例如,如果将项目合并在1,2和3的+/- 10%之内,那么,从本质上讲,还将在2.2到2.7之间(您想要的垃圾箱的“外部边缘”)存在一个垃圾箱,其中的数字为2.5走。 如果期望的分档之间存在值,则可能需要相应地调整截止值或可视化。

也许我简化了您的问题?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM