2013-07-30 8 views
29

Ich versuche, ein Histogramm einer Datenspalte zu erstellen und plotten logarithmisch (y-axis) und ich bin nicht sicher, warum der folgende Code nicht funktioniert:logarithmisch y-Achse Bins in Python

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

Ich habe auch versucht, anstelle von plt.yscale('log')Log=true in der plt.hist Zeile und auch versucht habe ich ax.set_yscale('log'), aber nichts scheint zu funktionieren. Ich bekomme entweder ein leeres Plot, entweder ist die y-axis tatsächlich logarithmisch (mit dem Code wie oben gezeigt), aber es sind keine Daten geplottet (keine Bins).

+0

möglich Duplikat [Python Pyplot Bar Plot disapear Barren, wenn log mit Maßstab] (http://stackoverflow.com/questions/14047068/python-pyplot-bar-plot-bars-disapear-when-using-log-scale) – tacaswell

+0

verwandtes Problem, andere Lösung – tacaswell

Antwort

57

versuchen

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

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

Das Problem mit dem Boden des Balkens ist bei y ist = 0 und der Standard ist in gültigen Punkten zu maskieren (log(0) -> nicht definiert), wenn das zu tun Log-Transformation (es gab Diskussionen darüber, dies zu ändern, aber ich erinnere mich nicht daran, wie es gelaufen ist), also wenn es versucht, die Rechtecke für Ihr Balkendiagramm zu zeichnen, wird die untere Kante ausgeblendet -> keine Rechtecke.

+0

Danke für die Antwort. Die von Ihnen vorgeschlagene Lösung löste die verschwindenden Balken, aber dann tauchte ein weiterer "Bug" auf: Alle Beschriftungen der y-logarithmischen Achse wurden übereinander gezeichnet. Dieses letzte Problem wurde gelöst, indem die Zeile "ax.set_ylim (0, 30)" kommentiert wurde. – mannaroth

+0

ja, weil die 0 in der Grenze zu einer sehr kleinen Zahl abgeschnitten ist, so dass Sie eine unangemessene Anzahl von Jahrzehnten haben. Verwenden Sie stattdessen "ax.set_ylim (1, 30)". – tacaswell

+0

Die Angabe von nonposy = 'clip' hat den Trick gemacht! – krinker

3

np.logspace kehrt Bins in [1-10], logarithmisch Abstand - in meinem Fall xx ist ein npvector> 0, so dass die folgenden Code funktioniert der Trick

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