Plot sumbu logaritmik dengan matplotlib dengan python


369

Saya ingin memplot grafik dengan satu sumbu logaritmik menggunakan matplotlib.

Saya sudah membaca dokumen, tetapi tidak bisa mengetahui sintaksnya. Saya tahu bahwa itu mungkin sesuatu yang sederhana seperti 'scale=linear'dalam argumen plot, tapi sepertinya saya tidak bisa memperbaikinya

Program sampel:

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

Jawaban:


384

Anda dapat menggunakan Axes.set_yscalemetode ini. Itu memungkinkan Anda untuk mengubah skala setelah Axesobjek dibuat. Itu juga akan memungkinkan Anda untuk membangun kontrol untuk membiarkan pengguna memilih skala jika Anda perlu.

Baris yang relevan untuk ditambahkan adalah:

ax.set_yscale('log')

Anda dapat menggunakan 'linear'untuk beralih kembali ke skala linier. Seperti apa kode Anda nantinya:

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

grafik hasil


6
Metode ini bagus karena berfungsi dengan semua jenis plot (misalnya histogram), tidak hanya dengan "plot" (yang dilakukan semilogx / semilogi)
Tim Whitcomb

16
Saya datang ke sini mencari cara menggunakan sumbu untuk kekuatan dua: pylab.gca (). Set_xscale ('log', basex = 2)
zje

53
Matplotlib memiliki semilogy(). Selain itu, lebih mudah untuk langsung menggunakan pyplot.yscale()daripada menggunakan ax.set_yscale('log'), karena tidak perlu mendapatkan axobjek (yang tidak selalu tersedia segera).
Eric O Lebigot

5
Jika Anda ingin skala log pada kedua sumbu, coba loglog()atau pada x-axis only trysemilogx()
drevicko

10
@ EOL Saya akan menyarankan yang sebaliknya. Lebih baik menggunakan axobjek eksplisit yang digunakan pyplotyang hanya mungkin berlaku untuk Axe yang Anda inginkan.
tacaswell

288

Pertama-tama, itu tidak rapi untuk dicampur pylabdan pyplotdikodekan. Terlebih lagi, gaya pyplot lebih disukai daripada menggunakan pylab .

Berikut ini adalah kode yang sedikit dibersihkan, hanya menggunakan pyplotfungsi:

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

Fungsi yang relevan adalah pyplot.yscale(). Jika Anda menggunakan versi berorientasi objek, ganti dengan metode Axes.set_yscale(). Ingatlah bahwa Anda juga dapat mengubah skala sumbu X, menggunakan pyplot.xscale()(atau Axes.set_xscale()).

Periksa pertanyaan saya. Apa perbedaan antara 'log' dan 'symlog'? untuk melihat beberapa contoh skala grafik yang ditawarkan matplotlib.


Memiliki waktu yang sulit mencoba mencari cara untuk melakukannya. Jawaban ini menyelamatkan hari saya!
HWende

13
pyplot.semilogy()lebih langsung.
Eric O Lebigot

64

Anda hanya perlu menggunakan semilogi alih-alih plot:

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, saya sedang mencoba log (FloatArray) untuk Wholetime, terima kasih Anda menyelamatkan hari saya
Pradeep

5
Ada juga semilogx . Jika Anda perlu login pada kedua sumbu, penggunaan loglog
drevicko

40

jika Anda ingin mengubah basis logaritma, cukup tambahkan:

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

8

Saya tahu ini sedikit di luar topik, karena beberapa komentar menyebutkan ax.set_yscale('log')untuk menjadi solusi "terbaik" saya pikir bantahan bisa terjadi. Saya tidak akan merekomendasikan penggunaan ax.set_yscale('log')untuk histogram dan plot bar. Dalam versi saya (0.99.1.1) saya mengalami beberapa masalah rendering - tidak yakin seberapa umum masalah ini. Namun kedua bar dan hist memiliki argumen opsional untuk mengatur skala y untuk login, yang berfungsi dengan baik.

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

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


5

Jadi jika Anda hanya menggunakan API yang tidak canggih, seperti saya sering (saya sering menggunakannya di ipython), maka ini hanyalah

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

Semoga ini bisa membantu seseorang mencari jawaban yang sederhana! :)


-1

Anda dapat menggunakan kode di bawah ini:

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)')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.