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()
Max Ghenis
sumber

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

Mathieu
sumber
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.

Denilson Sa Maia
sumber
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()
Scott McCammon
sumber
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
Dawid
sumber
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

pengguna3465408
sumber
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! :)

crazy2be
sumber
-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)')
Shailaja Gupta Kapoor
sumber