我有一些图像数据已使用numpy绘制在直方图中,如下面的代码所示。我遇到的问题是x轴以1的步长上升,但bin宽度约为1.3(我通过放大并查看bin宽度粗略计算得出)。
这将导致如下所示的直方图:
如您所见,直方图下降到零。如果放大,则值为0的点不是整数。因为我的数据是整数,所以数字550.8显然将出现0次,这将导致直方图显示在上方(我认为)。
如果将垃圾箱的数量从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()
最佳答案
正如您自己怀疑的那样,问题在于您的整数数据需要自定义拟合容器才能获得漂亮的直方图。实际上,对于直方图通常是这样。
考虑对问题的以下重构:
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数量设置为比可能的唯一整数值的数量稍微小的一点:
# 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)
越来越好了:
但显然有一些伪影是因为一些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加入垃圾箱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35347515/