web-dev-qa-db-fra.com

les bacs doivent augmenter de façon monotone

Je veux juste dessiner des histogrammes Matplotlib à partir de skimage.exposure mais je reçois un ValueError: bins must increase monotonically. L’image originale provient de ici et ici mon 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: les bacs doivent augmenter de façon monotone.

Mais la même erreur se produit lorsque je trie les valeurs des bacs:

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

ValueError: les bacs doivent augmenter de façon monotone.

J'ai finalement essayé de vérifier les valeurs des bacs, mais ils semblent triés à mon avis (tout conseil pour ce type de test serait également apprécié):

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

Aucune sortie de ceci.

Toute suggestion sur ce qui se passe?
J'essaie d'apprendre le python, alors soyez indulgent s'il vous plait. Voici mon installation (sur Linux Mint):

  • Python 2.7.13 :: Anaconda 4.3.1 (64 bits)
  • Jupyter 4.2.1
5

Matplotlib hist accepte les données en tant que premier argument, pas les comptes déjà groupés. Utilisez matplotlib bar pour le tracer. Notez que contrairement à numpy histogram, skimage exposure.histogram renvoie les centres des bacs.

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

La signature de plt.hist est plt.hist(data, bins, ...). Vous essayez donc de brancher l'histogramme déjà calculé en tant que bacs dans la fonction matplotlib hist. L'histogramme n'est bien sûr pas trié et par conséquent, l'erreur "Les bacs doivent augmenter de façon monotone" est générée. 

Bien que vous puissiez bien sûr utiliser plt.hist(hist, bins), il est discutable de savoir si l'histogramme d'un histogramme est utile. Je suppose que vous voulez simplement tracer le résultat du premier histogramme. 

L'utilisation d'un graphique à barres aurait du sens à cette fin:

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