Logaritmik eksenleri python'da matplotlib ile çizin


369

Matplotlib kullanarak bir logaritmik eksen ile bir grafik çizmek istiyorum.

Belgeleri okuyordum, ancak sözdizimini anlayamıyorum. Bunun muhtemelen 'scale=linear'arsa argümanlarındaki gibi basit bir şey olduğunu biliyorum , ama doğru anlayamıyorum

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

Yanıtlar:


384

Axes.set_yscaleYöntemi kullanabilirsiniz . Bu, Axesnesne oluşturulduktan sonra ölçeği değiştirmenize olanak tanır . Bu, kullanıcının gerekirse ölçeği seçmesine izin vermek için bir kontrol oluşturmanıza da izin verir.

Eklenecek ilgili satır:

ax.set_yscale('log')

'linear'Doğrusal bir ölçeğe geri dönmek için kullanabilirsiniz . Kodunuz şöyle görünecektir:

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

sonuç çizelgesi


6
Bu yöntem güzeldir, çünkü sadece "arsa" (yarılogx / yarıloji ne yapar) ile değil, her türlü arsa (örn. Histogram) ile çalışır
Tim Whitcomb

16
Buraya iki güç için bir eksenin nasıl kullanılacağını aramaya geldim: pylab.gca (). Set_xscale ('log', basex = 2)
zje

53
Matplotlib vardır semilogy(). Dahası, nesneyi almaya gerek olmadığından (her zaman hemen mevcut olmayan) doğrudan kullanmaktan pyplot.yscale()daha kolaydır . ax.set_yscale('log')ax
Eric O Lebigot

5
Her iki eksende günlük ölçekleri istiyorsanız, loglog()yalnızca x ekseninde deneyin veya deneyinsemilogx()
drevicko

10
@ EOL Aksini tavsiye ederim. Açık bir kullanmak daha iyidir axbu kullanıma nesneyi pyplotsadece olabilir siz istediğiniz Baltalar için geçerlidir.
tacaswell

288

Her şeyden önce, karıştırmak pylabve pyplotkodlamak çok düzenli değil . Dahası, pylab kullanımına göre pyplot stili tercih edilir .

Burada, yalnızca pyplotişlevleri kullanarak biraz temizlenmiş bir kod verilmiştir :

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

İlgili fonksiyon pyplot.yscale(). Nesneye yönelik sürümü kullanıyorsanız, bunu yöntemle değiştirin Axes.set_yscale(). X ekseni ölçeğini pyplot.xscale()(veya Axes.set_xscale()) kullanarak da değiştirebileceğinizi unutmayın .

Sorumu kontrol 'log' ve 'symlog' arasındaki fark nedir? matplotlib'in sunduğu grafik ölçeklerinin birkaç örneğini görmek için.


Nasıl yapılacağını anlamaya çalışırken zorlandık. Bu cevap günümü kurtardı!
HWende

13
pyplot.semilogy()daha doğrudan.
Eric O Lebigot

64

Çizim yerine yarılojiyi kullanmanız yeterlidir :

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

1
LOL, wholetime için log (FloatArray) deniyordum, teşekkürler günümü kurtardın
Pradeep

5
Ayrıca semilogx var . Her iki eksende oturum açmaya
drevicko

40

logaritmanın tabanını değiştirmek istiyorsanız, şunu ekleyin:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log

8

Bu biraz konu dışı biliyorum, çünkü bazı yorumlar ax.set_yscale('log')"en güzel" çözüm olarak bahsettiğim için bir çürütme olabilir düşündüm. ax.set_yscale('log')Histogramlar ve çubuk grafikler için kullanılmasını tavsiye etmem . Sürümümde (0.99.1.1) bazı oluşturma sorunları ile karşılaşıyorum - bu sorunun ne kadar genel olduğundan emin değilim. Ancak hem bar hem de hist, y ölçeğini günlüğe ayarlamak için isteğe bağlı bağımsız değişkenlere sahiptir;

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

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


5

Bu yüzden, çoğunlukla benim gibi karmaşık olmayan API'yi kullanıyorsanız (ipython'da çok kullanıyorum), bu sadece

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

Umarım bu basit bir cevap arayan birine yardımcı olur! :).


-1

Aşağıdaki kodu kullanabilirsiniz:

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)')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.