首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Numpy.histogram连接箱

Numpy.histogram连接箱
EN

Stack Overflow用户
提问于 2016-02-11 18:44:22
回答 1查看 1.4K关注 0票数 1

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

这将产生一个直方图,如下所示:

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

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

所以我终于问到我的问题了(为这个漫长的职位道歉!)是否有一种方式加入垃圾箱(当使用大量的数字,如我要解决我的初始问题)使用np.histogram。我想这只是美学,它并不重要,但看起来会更好。

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

我的代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-11 20:05:37

正如您自己所怀疑的那样,问题在于您的整数数据需要自定义适合的回收箱才能得到一个漂亮的直方图。事实上,直方图通常是这样的。

考虑以下问题的重构:

代码语言:javascript
复制
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之间:这意味着肯定会有几个回收箱是空的!

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

代码语言:javascript
复制
# 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变量,每个桶都包含一个整数。我建议使用np.arange(),由0.5向下移动

代码语言:javascript
复制
# 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)

就像它一样漂亮!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35347515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档