2013-07-30 31 views
29

sto cercando di creare un istogramma di una colonna di dati e tracciare lo logaritmicamente (y-axis) e io non sono sicuro perché il seguente codice non funziona:logaritmiche bidoni asse y in pitone

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

Ho anche provato invece di plt.yscale('log') aggiungendo Log=true nella riga plt.hist e anche io ho provato ax.set_yscale('log'), ma niente sembra funzionare. O ottengo una trama vuota, o lo y-axis è in effetti logaritmico (con il codice come mostrato sopra), ma non ci sono dati tracciati (niente bidoni).

+0

possibile duplicato del [Python Pyplot Bar Trama bars disapear quando si utilizza registro scala] (http://stackoverflow.com/questions/14047068/python-pyplot-bar-plot-bars-disapear-when-using-log-scale) – tacaswell

+0

problema correlato, soluzione diversa – tacaswell

risposta

57

prova

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

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

Il problema è con la parte inferiore di barre essendo in y = 0 e il difetto è quello di mascherare in validi punti (log(0) -> indefinito) quando si fa la log transformation (c'era una discussione su come cambiarlo, ma non ricordo da che parte fosse andato) così quando tenta di disegnare i rettangoli per il tuo grafico a barre, il bordo inferiore è mascherato -> nessun rettangolo.

+0

Grazie per la risposta. La soluzione che hai proposto ha risolto le barre scomparenti, ma poi è emerso un altro "bug": tutte le etichette dell'asse y-logaritmico sono state tracciate l'una sull'altra. Questo ultimo problema è stato risolto commentando la riga "ax.set_ylim (0, 30)". – mannaroth

+0

sì, perché lo 0 nel limite viene ritagliato su un numero molto piccolo in modo da avere un numero irragionevole di decenni. usa invece 'ax.set_ylim (1, 30)'. – tacaswell

+0

Specificare nonposy = 'clip' ha fatto il trucco! – krinker

3

np.logspace torna bidoni in [1-10], logaritmicamente distanziati - nel mio caso xx è un npvector> 0 in modo che il codice seguente fa il trucco

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