Python, Matplotlib, subplot: Làm cách nào để đặt phạm vi trục?


266

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

pylab.ylim([0,1000])

không có tác dụng Đây là toàn bộ kịch bản:

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

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


Câu trả lời:


284

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

 pylab.ylim([0,1000])

Lưu ý: Lệnh phải được thực hiện sau cốt truyện!


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

1
nếu tôi sử dụng điều này với hexbin, sử dụng ylim sau khi âm mưu () hiển thị nền trắng trên cả hai ô
lynxoid

3
Điều gì nếu bạn không sử dụng cốt truyện, nhưng savefig ??
Bến

8
Gọi plot(), sau đó ylim()và sau đó savefig().
therealrootuser

112

Sử dụng các đối tượng trục 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 hình và các ô phụ. Để thêm và thao tác trực tiếp với các đối tượng trục:

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
Như Rob gợi ý, giao diện OO trong matplotlib được ưa thích hơn giao diện pylab dựa trên trạng thái. "Mặc dù nhiều ví dụ sử dụng pylab, nhưng nó không còn được khuyến nghị nữa. Đối với âm mưu không tương tác, nên sử dụng pyplot để tạo các số liệu và sau đó là giao diện OO cho âm mưu." matplotlib.org/faq/ trộm
Bennett Brown

26

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

Trong trường hợp của bạn, bạn muốn đóng băng các giới hạn của trục y, nhưng cho phép trục x mở rộng để chứa dữ liệu của bạn. Do đó, bạn muốn thay đổi autoscaley_ontài sản để False. Đây là phiên bản 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))

0

Nếu bạn biết trục chính xác mà bạn muốn, thì

pylab.ylim([0,1000])

hoạt động như đã trả lời trước đó. Nhưng nếu bạn muốn một trục linh hoạt hơn để phù hợp với dữ liệu chính xác của bạn, như tôi đã làm khi tôi tìm thấy câu hỏi này, thì hãy đặt giới hạn trục là độ dài của tập dữ liệu của bạn. Nếu tập dữ liệu của bạn fftgiống như trong câu hỏi, thì hãy thêm nó sau lệnh cốt truyện của bạn:

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


0

Nếu bạn có nhiều ô con, tức là

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

Bạn có thể sử dụng cùng giới hạn y cho tất cả chúng. Nó được giới hạn của y ax từ cốt truyện đầu tiên.

plt.setp(ax, ylim=ax[0,0].get_ylim())
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.