问题
I just want to draw Matplotlib histograms from skimage.exposure but I get a ValueError: bins must increase monotonically.
The original image comes from here and here my code:
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: bins must increase monotonically.
But the same error arises when I sort the bins values:
import numpy as np
sorted_bins = np.sort(bins)
plt.hist(sorted_bins,hist)
ValueError: bins must increase monotonically.
I finally tried to check the bins values, but they seem sorted in my opinion (any advice for this kind of test would appreciated also):
if any(bins[:-1] >= bins[1:]):
print "bim"
No output from this.
Any suggestion on what happens?
I'm trying to learn Python, so be indulgent please. Here my install (on Linux Mint):
- Python 2.7.13 :: Anaconda 4.3.1 (64-bit)
- Jupyter 4.2.1
回答1:
Matplotlib hist
accept data as first argument, not already binned counts. Use matplotlib bar
to plot it. Note that unlike numpy histogram
, skimage exposure.histogram
returns the centers of bins.
width = bins[1] - bins[0]
plt.bar(bins, hist, align='center', width=width)
plt.show()
回答2:
The signature of plt.hist
is plt.hist(data, bins, ...)
. So you are trying to plug the already computed histogram as bins into the matplotlib hist
function. The histogram is of course not sorted and therefore the "bins must increase monotonically"-error is thrown.
While you could of course use plt.hist(hist, bins)
, it's questionable if histogramming a histogram is of any use. I would guess that you want to simply plot the result of the first histogramming.
Using a bar chart would make sense for this purpose:
hist,bins=numpy.histogram(img)
plt.bar(bins[:-1], hist, width=(bins[-1]-bins[-2]), align="edge")
来源:https://stackoverflow.com/questions/44166763/bins-must-increase-monotonically