垃圾箱必须单调增加

时间:2017-05-24 19:13:08

标签: python matplotlib scikit-image

我只想从skimage.exposure中绘制Matplotlib直方图,但我得到ValueError: bins must increase monotonically.原始图片来自here,这里是我的代码:

from skimage import io, exposure
import matplotlib.pyplot as plt

img = io.imread('img/coins_black_small.jpg', as_grey=True)
hist,bins=exposure.histogram(img)

plt.hist(bins,hist)
  

ValueError:bin必须单调增加。

但是当我对bin值进行排序时会出现同样的错误:

import numpy as np
sorted_bins = np.sort(bins)
plt.hist(sorted_bins,hist)
  

ValueError:bin必须单调增加。

我终于尝试检查了箱子的价值,但是我认为它们似乎是排序的(对于这种测试的任何建议也会受到赞赏):

if any(bins[:-1] >= bins[1:]):
    print "bim"

没有输出。

关于会发生什么的任何建议?
我正在努力学习Python,所以请放纵。这是我的安装(在Linux Mint上):

  • Python 2.7.13 :: Anaconda 4.3.1(64位)
  • Jupyter 4.2.1

3 个答案:

答案 0 :(得分:6)

Matplotlib hist接受数据作为第一个参数,而不是已经分箱的计数。使用matplotlib bar绘制它。请注意,与numpy histogram不同,skimage exposure.histogram会返回垃圾箱的中心。

width = bins[1] - bins[0]
plt.bar(bins, hist, align='center', width=width)
plt.show()

答案 1 :(得分:1)

plt.hist的签名是plt.hist(data, bins, ...)。因此,您尝试将已计算的直方图作为二进制数插入到matplotlib hist函数中。直方图当然没有排序,因此“箱必须单调增加” - 抛出错误。

虽然你当然可以使用plt.hist(hist, bins),但直方图的直方图是否有用是值得怀疑的。我猜你想简单地绘制第一个直方图的结果。

使用条形图可以达到此目的:

hist,bins=numpy.histogram(img)
plt.bar(bins[:-1], hist, width=(bins[-1]-bins[-2]), align="edge")

答案 2 :(得分:1)

正确的解决方法是:

所有bin值必须为整数,不能为小数!您可以使用round() 功能。