python - 带有 bins 值百分比的直方图?

标签 python algorithm histogram

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

最佳答案

通常,使用 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 大小。在许多情况下,这种粗粒度化可能会扭曲您尝试比较的数字之间的关系。

至于您的值(value) +/-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 之间,那么您可能需要相应地调整截止值或可视化。

关于python - 带有 bins 值百分比的直方图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320395/

相关文章:

python - 在时间戳上加入两个不同的数据帧

c++ - std::map 的底层结构是什么?

matlab - 控制散点图条颜色

c++ - 如何从二维数据生成 OpenCV 一维直方图?

algorithm - 秩相关算法

r - 在 R 中绘制矩阵 "by parts"?

python - 将excel导入mysql使用python并转换日期戳

python - 在 Selenium 中控制 Firefox 选项卡

python - 创建 python 生成器后更新它

java - 总结时四舍五入到小数点后 2 位