Numpy.histogram加入垃圾箱

时间:2016-02-11 18:44:22

标签: python numpy histogram

我有一些图像数据,我使用numpy在直方图中绘制,如下面的代码所示。我遇到的问题是x轴以1为单位上升,但是bin宽度约为1.3(我通过放大并查看bin宽度来粗略计算)。

这导致直方图如下所示:

enter image description here

正如您在某些点上所看到的,直方图下降到零。如果我放大,则值为0的点不是整数。因为我的数据是整数,所以数字550.8显然会出现0次,这导致直方图具有上面的外观(我认为)。

如果我将垃圾箱的数量从100增加到1000,我可以解决这个问题。这给我留下了下面的直方图:

enter image description here

所以我终于得到了我的问题(为长篇帖子道歉!)...... 是否有一种方法可以使用np.histogram加入这些垃圾箱(当使用像我这样的大数字来解决我的初始问题时)。 我认为这只是美学,它不是必不可少的,但看起来会更好。

我在这里看到了其他帖子,但几乎所有帖子都使用plt.hist作为直方图,而不是np.histogram

我的代码:

def histo():

    heights,edges = np.histogram(data, bins=100, range=(minvalue,maxvalue))
    edges = edges[:-1]+(edges[1]-edges[0]) ### not entirely sure what this line is actually doing

    fig, ax = plt.subplots()
    ax.plot(edges,heights)                                                 

    ax.set(title=title, xlabel='ADC Value(DN/40)', ylabel='Frequency')

    #do some analysis of the data between two clicks

    point1, point2 = fig.ginput(2)                                          
    ax.axvspan(point1[0], point2[0], color='blue', alpha=0.5)            
    mask = (edges>point1[0]) & (edges<point2[0])

    ## more analysis code ##       


data = someimage_data

histo()

1 个答案:

答案 0 :(得分:3)

正如您自己怀疑的那样,问题是您的整数数据需要自定义条箱以获得漂亮的直方图。事实上,直方图通常都是如此。

考虑以下问题的重建:

import numpy as np

# generate data
data = np.floor(np.random.randn(10000)*20+620)
data = dat[(560<dat) & (dat<650)]

# do what you're doing
heights,edges = np.histogram(data, bins=100, range=(data.min(),data.max()))
edges = edges[:-1]+(edges[1]-edges[0]) # shift first x coordinate to edges[1]
                                     # and drop last point: 1 more edge than bins

fig, ax = plt.subplots()
ax.plot(edges,heights)

结果令人信服地丑陋:

before

问题是你使用的是100个箱子,但你的整数值在560到650之间:这意味着几个箱子肯定是空的!

一个简单的解决方案是设置一个比可能的唯一整数值​​稍小的bin计数:

# do what you're doing
range = [data.min(),data.max()]
heights,edges = np.histogram(data, bins=np.ceil((range[1]-range[0])*0.95), range=range)
edges = edges[:-1]+(edges[1]-edges[0]) # shift first x coordinate to edges[1]

fig, ax = plt.subplots()
ax.plot(edges,heights)

它越来越好了:

better

但很明显,有些文件包含多个整数,而其他文件则没有。这是原始问题的一个不太令人震惊的例子。

最终解决方案是为您的问题使用量身定制的箱子:对箱子使用array_like变量,每个箱子包含一个整数。我建议使用np.arange(),向下移动0.5

# do what you're doing
range = [data.min(),data.max()]
bins = np.arange(range[0],range[1]+2) - 0.5
heights,edges = np.histogram(data, bins=bins, range=range)
edges = edges[:-1]+(edges[1]-edges[0]) # shift first x coordinate to edges[1]

fig, ax = plt.subplots()
ax.plot(edges,heights)

它很漂亮!

best