Rysuj osie logarytmiczne za pomocą matplotlib w python

369

Chcę wykreślić wykres z jedną osią logarytmiczną za pomocą matplotlib.

Czytałem dokumenty, ale nie mogę zrozumieć składni. Wiem, że jest to prawdopodobnie coś prostego jak 'scale=linear'w argumentach fabularnych, ale wydaje mi się, że nie mam racji

Przykładowy program:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()
Max Ghenis
źródło

Odpowiedzi:

384

Możesz użyć tej Axes.set_yscalemetody. Umożliwia to zmianę skali po utworzeniu Axesobiektu. Pozwoliłoby to również na zbudowanie formantu, który pozwoli użytkownikowi wybrać skalę, jeśli zajdzie taka potrzeba.

Odpowiednia linia do dodania to:

ax.set_yscale('log')

Możesz użyć, 'linear'aby przełączyć z powrotem na skalę liniową. Oto jak wyglądałby Twój kod:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)

ax.set_yscale('log')

pylab.show()

tabela wyników

Mathieu
źródło
6
Ta metoda jest dobra, ponieważ działa na wszelkiego rodzaju wykresach (np. Histogramach), a nie tylko na „wykresie” (czyli tym, co robi semilogx / semilogy)
Tim Whitcomb
16
Przybyłem tutaj, szukając sposobu wykorzystania osi dla potęg dwóch: pylab.gca (). Set_xscale ('log', basex = 2)
zje
53
Matplotlib ma semilogy(). Co więcej, łatwiej jest bezpośrednio używać pyplot.yscale()niż używać ax.set_yscale('log'), ponieważ nie ma potrzeby uzyskania axobiektu (który nie zawsze jest natychmiast dostępny).
Eric O Lebigot,
5
Jeśli chcesz mieć logi na obu osiach, spróbuj loglog()lub spróbuj tylko na osi semilogx()
X
10
@EOL Radziłbym coś przeciwnego. Lepiej jest użyć jawnego axobiektu, którego można użyć, pyplotktóry może dotyczyć tylko wybranych osi.
tacaswell
288

Po pierwsze, miksowanie pylabi pyplotkodowanie nie jest zbyt proste . Co więcej, styl pyplot jest lepszy niż użycie pylab .

Oto nieco wyczyszczony kod, wykorzystujący tylko pyplotfunkcje:

from matplotlib import pyplot

a = [ pow(10,i) for i in range(10) ]

pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()

Odpowiednią funkcją jest pyplot.yscale(). Jeśli korzystasz z wersji obiektowej, zastąp ją metodą Axes.set_yscale(). Pamiętaj, że możesz także zmienić skalę osi X, używając pyplot.xscale()(lub Axes.set_xscale()).

Sprawdź moje pytanie Jaka jest różnica między „log” a „symlog”? aby zobaczyć kilka przykładów skal graficznych oferowanych przez matplotlib.

Denilson Sá Maia
źródło
Z trudem próbowałem wymyślić, jak to zrobić. Ta odpowiedź uratowała mi dzień!
HWende,
13
pyplot.semilogy()jest bardziej bezpośredni.
Eric O Lebigot,
64

Musisz po prostu użyć semilogii zamiast wykresu:

from pylab import *
import matplotlib.pyplot  as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)

line, = ax.semilogy(a, color='blue', lw=2)
show()
Scott McCammon
źródło
1
LOL, próbowałem loga (FloatArray) na czas letni, dziękuję, że uratowałeś mi dzień
Pradeep
5
Jest też semilogx . Jeśli potrzebujesz zalogować się na obu osiach, użyj loglog
drevicko
40

jeśli chcesz zmienić podstawę logarytmu, po prostu dodaj:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log
Dawid
źródło
8

Wiem, że jest to nieco nie na temat, ponieważ niektóre komentarze wspominały, że ax.set_yscale('log')jest to „najładniejsze” rozwiązanie, które moim zdaniem może być obaleniem. Nie polecałbym używania ax.set_yscale('log')do histogramów i wykresów słupkowych. W mojej wersji (0.99.1.1) mam problemy z renderowaniem - nie jestem pewien, jak ogólny jest ten problem. Jednak zarówno bar, jak i hist mają opcjonalne argumenty, aby ustawić skalę y na log, co działa dobrze.

referencje: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

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

użytkownik3465408
źródło
5

Więc jeśli po prostu używasz niewyszukanego API, tak jak ja często (często używam go w ipython), to jest to po prostu

yscale('log')
plot(...)

Mam nadzieję, że to pomoże komuś, kto szuka prostej odpowiedzi! :)

crazy2be
źródło
-1

Możesz użyć poniższego kodu:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
Shailaja Gupta Kapoor
źródło