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):
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()
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")