Ubah skala sumbu x di matplotlib

95

Saya membuat plot ini menggunakan Matlab

masukkan deskripsi gambar di sini

Menggunakan matplotlib, sumbu x menarik angka besar seperti 100000, 200000, 300000. Saya ingin memiliki sesuatu seperti 1, 2, 3 dan 10 ^ 5 untuk menunjukkan bahwa sebenarnya 100000, 200000, 300000.

Apakah ada cara sederhana untuk membuat skala seperti itu di matplotlib?

Burung rajawali
sumber

Jawaban:

147

Coba gunakan matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Ini berlaku notasi ilmiah (yaitu a x 10^b) untuk tanda centang sumbu x Anda

Chris
sumber
9
apakah mungkin menambahkan offset? (misalnya, bukan 0,0, 0,5, 1,0, 1,5, ... dan x 10 ^ b akan menjadi 0, 5, 10, 15, ... dan x 10 ^ {b-1})
Eagle
24
ticklabel_formatjuga merupakan metode untuk objek sumbu, Anda dapat mencoba sesuatu sepertiax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich
Bagaimana ini bisa bekerja jika Anda memiliki subplot, katakanlah, 2 plot?
FaCoffee
2
@Eagle maaf, pertanyaan tindak lanjut Anda tentang menambahkan offset adalah yang saya maksud. sumbu x saya adalah [0.1, 0.2, ...]dan saya lebih suka [1, 2, ...]dengan eksponen yang disesuaikan. apakah Anda dapat menemukan solusi untuk itu?
trianta2
@Eagle Saya juga tertarik dengan pertanyaan trianta2 yang disebutkan
Ben Usman
15

Ini bukanlah jawaban atas pertanyaan awal Anda, melainkan untuk salah satu pertanyaan yang Anda miliki di badan pertanyaan Anda.

Sedikit basa-basi, agar penamaan saya tidak terasa aneh:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Seperti yang telah disebutkan, Anda dapat menggunakan ticklabel_format untuk menentukan bahwa matplotlib harus menggunakan notasi ilmiah untuk nilai besar atau kecil:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Anda dapat memengaruhi cara ini ditampilkan menggunakan flag di rcParams (dari matplotlib import rcParams) atau dengan menyetelnya secara langsung. Saya belum menemukan cara yang lebih elegan untuk mengubah antara notasi ilmiah '1e' dan 'x10 ^' selain:

ax.xaxis.major.formatter._useMathText = True

Ini akan memberi Anda lebih banyak Matlab-esc, dan memang penampilan yang bisa dibilang lebih baik. Saya pikir hal berikut harus melakukan hal yang sama:

rc('text', usetex=True)
Weir_Doe
sumber
11

The formatter skalar mendukung mengumpulkan eksponen. Dokumentasinya adalah sebagai berikut:

class matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Basis: matplotlib.ticker.Formatter

Lokasi centang adalah nomor lama biasa. Jika useOffset == True dan rentang data jauh lebih kecil daripada rata-rata data, maka offset akan ditentukan sedemikian rupa sehingga label centang bermakna. Notasi ilmiah digunakan untuk data <10 ^ -n atau data> = 10 ^ m, dimana n dan m adalah batas daya yang ditetapkan menggunakan set_powerlimits ((n, m)). Default untuk ini dikontrol oleh parameter rc axes.formatter.limits.

teknik Anda adalah:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

Untuk menampilkan eksponen dalam format x10^5, buat instance ScalarFormatter dengan useMathText=True.

Setelah Gambar

Anda juga bisa menggunakan:

xfmt.set_useOffset(10000)

Untuk mendapatkan hasil seperti ini:

masukkan deskripsi gambar di sini

Carl F.
sumber
3
Buat instance ScalarFormatter dengan useMathText=Trueto get x10^4.
Sampai Hoffmann
9

Saya menemukan solusi sederhana

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
cunzhang
sumber