【问题标题】:Numpy.histogram joining binsNumpy.histogram 加入垃圾箱
【发布时间】:2016-05-22 17:05:34
【问题描述】:

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

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

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

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

所以我终于得到了我的问题(为长篇文章道歉!)...... 有没有办法使用 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()

【问题讨论】:

    标签: python numpy histogram


    【解决方案1】:

    当您自己怀疑它时,问题是您的整数数据需要自定义符合垃圾箱来获得漂亮的直方图。事实上,这通常是针对直方图的真实。

    考虑以下重建问题:

    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)
    

    结果是令人信服的丑陋:

    问题是您使用100个垃圾箱,但您的整数值介于560和650之间:这意味着几个垃圾箱肯定会为空!

    一个简单的解决方案是设置稍微较小的垃圾箱数量,而不是您可能的唯一整数值​​的数量:

    # 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)
    

    它越来越好:

    但显然存在一些垃圾箱中包含多个整数的伪像,而其他则没有。这是一个令人震惊的原始问题的实例。

    终极解决方案是将量身定制的垃圾箱用于您的问题:使用array_like 5变量为箱,每个频率包含一个整数。我建议使用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)
    

    ,它很漂亮!

    【讨论】:

    • 太棒了!非常彻底的答案和解释,适合我。非常感谢。
    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多