web-dev-qa-db-ja.com

ビンは単調に増加する必要があります

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:ビンは単調に増加する必要があります。

しかし、ビンの値をソートすると同じエラーが発生します。

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

ValueError:ビンは単調に増加する必要があります。

ようやくビンの値を確認しようとしましたが、私の意見ではソートされているようです(この種のテストについてのアドバイスもありがたいです)。

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

これからの出力はありません。

何が起こるかについて何か提案はありますか?
私はPythonを学習しようとしているので、のんびりしてください。ここに私のインストール(Linux Mint):

  • Python 2.7.13 :: Anaconda 4.3.1(64ビット)
  • Jupyter 4.2.1
7

Matplotlib histは、最初にビニングされたカウントではなく、最初の引数としてデータを受け入れます。プロットするには、matplotlib barを使用します。 numpy histogramとは異なり、skimage exposure.histogramはビンの中心を返します。

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

_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")
_