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

这将导致如下所示的直方图:

python - Numpy.histogram加入垃圾箱-LMLPHP

如您所见,直方图下降到零。如果放大,则值为0的点不是整数。因为我的数据是整数,所以数字550.8显然将出现0次,这将导致直方图显示在上方(我认为)。

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

python - Numpy.histogram加入垃圾箱-LMLPHP

所以我终于要提我的问题了(很长的歉意!)...
有没有一种方法可以使用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()

最佳答案

正如您自己怀疑的那样,问题在于您的整数数据需要自定义拟合容器才能获得漂亮的直方图。实际上,对于直方图通常是这样。

考虑对问题的以下重构:

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)


结果令人难以置信的丑陋:

python - Numpy.histogram加入垃圾箱-LMLPHP

问题是您使用的是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)


越来越好了:

python - Numpy.histogram加入垃圾箱-LMLPHP

但显然有一些伪影是因为一些bin包含多个整数,而其他bin则没有。这是原始问题不太令人震惊的实例。

最终的解决方案是使用量身定制的垃圾箱来解决您的问题:对垃圾箱使用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)


而且很漂亮!

python - Numpy.histogram加入垃圾箱-LMLPHP

关于python - Numpy.histogram加入垃圾箱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35347515/

10-09 19:14