2010-05-17 31 views
231

Làm cách nào tôi có thể đặt phạm vi trục y của phụ đề thứ hai thành ví dụ: [0,1000]? Mảng FFT của dữ liệu của tôi (một cột trong một tệp văn bản) dẫn đến một (inf.?) Tăng đột biến để dữ liệu thực tế không hiển thị.Python, Matplotlib, subplot: Cách đặt phạm vi trục?

pylab.ylim([0,1000]) 

không có tác dụng. Đây là toàn bộ tập lệnh:

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

Các cải tiến khác cũng được đánh giá cao!

+0

Xem thêm http://stackoverflow.com/questions/15858192/how-to-set-xlim-and-ylim-for-a-subplot-in-matplotlib/15858264? Noredirect = 1 – tacaswell

Trả lời

256

Như tìm thấy trong http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx

pylab.ylim([0,1000]) 

Lưu ý: Lệnh này phải được thực hiện sau khi âm mưu!

+2

Bất cứ khi nào tôi làm điều này, nó lật hình ảnh lộn ngược. – ely

+1

nếu tôi sử dụng này với hexbin, sử dụng ylim sau khi lô() phơi bày nền trắng trên cả hai lô – lynxoid

+3

Nếu bạn không sử dụng cốt truyện, nhưng savefig ?? – Ben

24

Đôi khi bạn thực sự muốn đặt giới hạn trục trước bạn vẽ đồ thị dữ liệu. Trong trường hợp đó, bạn có thể đặt tính năng "tự động" của đối tượng Axes hoặc AxesSubplot. Các chức năng quan tâm là set_autoscale_on, set_autoscalex_onset_autoscaley_on.

Trong trường hợp của bạn, bạn muốn cố định giới hạn của trục y, nhưng cho phép trục x mở rộng để phù hợp với dữ liệu của bạn. Do đó, bạn muốn thay đổi thuộc tính autoscaley_on thành False. Dưới đây là phiên bản được sửa đổi của đoạn mã phụ FFT từ mã của bạn:

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

Sử dụng axes objects là một cách tiếp cận tuyệt vời cho việc này. Nó giúp nếu bạn muốn tương tác với nhiều con số và tiểu lô. Để thêm và thao tác các trục đối tượng trực tiếp:

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

Như Rob đề xuất, giao diện OO trong matplotlib được ưu tiên hơn giao diện pylab dựa trên trạng thái. "Mặc dù nhiều ví dụ sử dụng giá treo, nó không còn được khuyến nghị nữa. Đối với âm mưu không tương tác, nó được đề xuất sử dụng pyplot để tạo các hình và sau đó là giao diện OO để vẽ đồ thị." https://matplotlib.org/faq/usage_faq.html#matplotlib-pyplot-and-pylab-how-are-they-related –

Các vấn đề liên quan