Python, Matplotlib, subplot: Cara mengatur rentang sumbu?

266

Bagaimana saya bisa mengatur kisaran sumbu y dari subplot kedua menjadi misalnya [0,1000]? Plot FFT data saya (kolom dalam file teks) menghasilkan lonjakan (inf.?) Sehingga data aktual tidak terlihat.

pylab.ylim([0,1000])

sayangnya tidak berpengaruh. Ini adalah keseluruhan skrip:

# based on http://www.swharden.com/blog/2009-01-21-signal-filtering-with-python/
import numpy, scipy, pylab, random

xs = []
rawsignal = []
with open("test.dat", 'r') as f:
      for line in f:
            if line[0] != '#' and len(line) > 0:
                xs.append( int( line.split()[0] ) )
                rawsignal.append( int( line.split()[1] ) )

h, w = 3, 1
pylab.figure(figsize=(12,9))
pylab.subplots_adjust(hspace=.7)

pylab.subplot(h,w,1)
pylab.title("Signal")
pylab.plot(xs,rawsignal)

pylab.subplot(h,w,2)
pylab.title("FFT")
fft = scipy.fft(rawsignal)
#~ pylab.axis([None,None,0,1000])
pylab.ylim([0,1000])
pylab.plot(abs(fft))

pylab.savefig("SIG.png",dpi=200)
pylab.show()

Peningkatan lainnya juga dihargai!

some one
sumber

Jawaban:

284

Seperti yang ditemukan di http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx

 pylab.ylim([0,1000])

Catatan: Perintah harus dieksekusi setelah plot!

some one
sumber
3
Setiap kali saya melakukan ini, itu membalik gambar terbalik.
ely
1
jika saya menggunakan ini dengan hexbin, gunakan ylim setelah plot () memperlihatkan latar belakang putih di kedua plot
lynxoid
3
APA jika Anda tidak menggunakan plot, tetapi savefig ??
Ben
8
Panggil plot(), lalu ylim()dan kemudian savefig().
therealrootuser
112

Menggunakan objek kapak adalah pendekatan yang bagus untuk ini. Ini membantu jika Anda ingin berinteraksi dengan banyak gambar dan sub-plot. Untuk menambah dan memanipulasi objek sumbu secara langsung:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,9))

signal_axes = fig.add_subplot(211)
signal_axes.plot(xs,rawsignal)

fft_axes = fig.add_subplot(212)
fft_axes.set_title("FFT")
fft_axes.set_autoscaley_on(False)
fft_axes.set_ylim([0,1000])
fft = scipy.fft(rawsignal)
fft_axes.plot(abs(fft))

plt.show()
ʀᴏʙ
sumber
2
Seperti yang disarankan Rob, antarmuka OO di matplotlib lebih disukai daripada antarmuka pylab berbasis negara. "Meskipun banyak contoh menggunakan pylab, tidak lagi direkomendasikan. Untuk plot non-interaktif disarankan untuk menggunakan pyplot untuk membuat angka dan kemudian antarmuka OO untuk plot." matplotlib.org/faq/…
Bennett Brown
26

Terkadang Anda benar-benar ingin menetapkan batas sumbu sebelum Anda memplot data. Dalam hal ini, Anda dapat mengatur fitur "autoscaling" objek Axesatau AxesSubplot. Fungsi bunga set_autoscale_on, set_autoscalex_ondan set_autoscaley_on.

Dalam kasus Anda, Anda ingin membekukan batas sumbu y, tetapi biarkan sumbu x meluas untuk mengakomodasi data Anda. Karena itu, Anda ingin mengubah autoscaley_onproperti menjadi False. Berikut ini adalah versi modifikasi potongan subplot FFT dari kode Anda:

fft_axes = pylab.subplot(h,w,2)
pylab.title("FFT")
fft = scipy.fft(rawsignal)
pylab.ylim([0,1000])
fft_axes.set_autoscaley_on(False)
pylab.plot(abs(fft))
andrewtinka
sumber
0

Jika Anda tahu sumbu yang tepat yang Anda inginkan, maka

pylab.ylim([0,1000])

berfungsi seperti dijawab sebelumnya. Tetapi jika Anda ingin sumbu yang lebih fleksibel agar sesuai dengan data Anda, seperti yang saya lakukan ketika saya menemukan pertanyaan ini, maka atur batas sumbu menjadi panjang dataset Anda. Jika dataset Anda fftseperti dalam pertanyaan, tambahkan ini setelah perintah plot Anda:

length = (len(fft)) pylab.ylim([0,length])

Christian Seitz
sumber
0

Jika Anda memiliki beberapa subplot, yaitu

fig, ax = plt.subplots(4, 2)

Anda dapat menggunakan batas y yang sama untuk semuanya. Ia mendapat batas kapak y dari plot pertama.

plt.setp(ax, ylim=ax[0,0].get_ylim())
Tajni
sumber