2013-07-30 15 views
29

Próbuję utworzyć histogram kolumny danych i wykreślić go logarytmicznie (y-axis) i nie jestem pewien, dlaczego następujący kod nie działa:logarytmiczne kosze na osi y w Pythonie

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

Próbowałem również zamiast plt.yscale('log') dodając Log=true w linii plt.hist, a także próbowałem ax.set_yscale('log'), ale nic nie działa. Albo dostaję pustą działkę, albo y-axis jest rzeczywiście logarytmiczna (z kodem jak pokazano powyżej), ale nie ma danych naniesionych na wykres (bez skrzynek).

+0

możliwe duplikat [Python Pyplot Bar Działka barów disapear podczas korzystania z dziennika skala] (http://stackoverflow.com/questions/14047068/python-pyplot-bar-plot-bars-disapear-when-using-log-scale) – tacaswell

+0

powiązany problem, inne rozwiązanie – tacaswell

Odpowiedz

57

spróbować

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

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

Problem jest z dolnej części prętów będących przy y = 0 i domyślnie jest do maskowania w nieważnej punktów (log(0) -> niezdefiniowany), gdy robi log transformacja (była dyskusja na temat zmiany tego, ale nie pamiętam, w którą stronę poszła), więc kiedy próbuje narysować prostokąty dla twojego wykresu słupkowego, dolna krawędź jest maskowana -> brak prostokątów.

+0

Dzięki za odpowiedź. Proponowane rozwiązanie rozwiązało znikające pręty, ale pojawił się kolejny "błąd": wszystkie etykiety osi logarytmu y zostały naniesione jedna na drugą. Ten ostatni problem został rozwiązany przez komentowanie linii "ax.set_ylim (0, 30)". – mannaroth

+0

tak, ponieważ 0 w limicie jest obcięte do bardzo małej liczby, więc masz nieuzasadnioną liczbę dziesięcioleci. zamiast tego użyj 'ax.set_ylim (1, 30)'. – tacaswell

+0

Określenie nonposy = 'clip' załatwiło sprawę! – krinker

3

np.logspace zwraca kosze w [1-10], logarytmicznie rozmieszczone - w moim przypadku xx to npvector> 0 więc następujący kod załatwia sprawę

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