web-dev-qa-db-fra.com

Bins de l'axe y logarithmique dans python

J'essaie de créer un histogramme d'une colonne de données et de le tracer de façon logarithmique (y-axis) Et je ne sais pas pourquoi le code suivant ne fonctionne pas:

import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('foo.bar')
fig = plt.figure()
ax = fig.add_subplot(111)
plt.hist(data, bins=(23.0, 23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0))
ax.set_xlim(23.5, 28)
ax.set_ylim(0, 30)
ax.grid(True)
plt.yscale('log')
plt.show()

J'ai également essayé au lieu de plt.yscale('log') d'ajouter Log=true Dans la ligne plt.hist Et j'ai également essayé ax.set_yscale('log'), mais rien ne semble fonctionner. Je reçois soit un tracé vide, soit le y-axis Est en effet logarithmique (avec le code comme indiqué ci-dessus), mais il n'y a pas de données tracées (pas de bacs).

39
mannaroth

essayer

plt.yscale('log', nonposy='clip')

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.yscale

Le problème est que le bas des barres est à y = 0 et la valeur par défaut est de masquer les points non valides (log(0) -> non défini) lors de la transformation du journal (il a été question de changer cela, mais Je ne me souviens pas dans quelle direction cela s'est passé) donc quand il essaie de dessiner les rectangles pour votre graphique à barres, le bord inférieur est masqué -> pas de rectangles.

78
tacaswell

np.logspace renvoie des bacs dans [1-10], espacé logarithmiquement - dans mon cas xx est un npvecteur> 0 donc le code suivant fait l'affaire

logbins=np.max(xx)*(np.logspace(0, 1, num=1000) - 1)/9
hh,ee=np.histogram(xx, density=True, bins=logbins)
3
Luca Rigazio