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!


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!


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

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

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


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