Python, Matplotlib, subplot: จะตั้งช่วงแกนได้อย่างไร?


266

ฉันจะกำหนดช่วงแกน y ของแผนย่อยที่สองเป็น [0,1000] ได้อย่างไร พล็อต FFT ของข้อมูลของฉัน (คอลัมน์ในไฟล์ข้อความ) ส่งผลให้เกิดการขัดขวาง (inf.?) เพื่อไม่ให้มองเห็นข้อมูลจริง

pylab.ylim([0,1000])

ไม่มีผลโชคไม่ดี นี่คือสคริปต์ทั้งหมด:

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

การปรับปรุงอื่น ๆ ยังชื่นชม!


คำตอบ:


284

พบได้ในhttp://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx

 pylab.ylim([0,1000])

หมายเหตุ: คำสั่งจะต้องมีการดำเนินการหลังจากพล็อต!


3
เมื่อใดก็ตามที่ฉันทำเช่นนี้มันพลิกภาพคว่ำ
ely

1
ถ้าผมใช้วิธีนี้กับ hexbin, ใช้ ylim หลังจากที่พล็อต () exposes พื้นหลังสีขาวทั้งแปลง
lynxoid

3
เกิดอะไรขึ้นถ้าคุณไม่ได้ใช้พล็อต แต่ savefig ??
เบ็น

8
โทรplot()แล้วแล้วylim() savefig()
therealrootuser

112

การใช้วัตถุแกนเป็นวิธีที่ดีสำหรับการนี้ ช่วยถ้าคุณต้องการโต้ตอบกับตัวเลขและแผนการย่อยหลายรายการ ในการเพิ่มและจัดการวัตถุแกนโดยตรง:

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
ดังที่ Rob แนะนำให้ใช้อินเตอร์เฟส OO ใน matplotlib ผ่านอินเตอร์เฟส pylab ที่อิงกับสถานะ "แม้ว่าตัวอย่างจำนวนมากจะใช้ pylab แต่ก็ไม่แนะนำอีกต่อไปสำหรับการทำพล็อตแบบไม่โต้ตอบเราขอแนะนำให้ใช้ pyplot เพื่อสร้างตัวเลขจากนั้นใช้ส่วนต่อประสาน OO สำหรับการลงจุด" matplotlib.org/faq/…
Bennett Brown

26

บางครั้งคุณต้องการตั้งค่าขีด จำกัด ของแกนก่อนที่จะพล็อตข้อมูล ในกรณีนี้คุณสามารถตั้งค่าคุณสมบัติ "การปรับค่าอัตโนมัติ" ของวัตถุAxesหรือAxesSubplotวัตถุ ฟังก์ชั่นที่น่าสนใจset_autoscale_on, และset_autoscalex_onset_autoscaley_on

ในกรณีของคุณคุณต้องการตรึงขีด จำกัด แกน y แต่อนุญาตให้แกน x ขยายเพื่อรองรับข้อมูลของคุณ ดังนั้นคุณต้องการเปลี่ยนคุณสมบัติการautoscaley_on Falseนี่คือตัวอย่างข้อมูลย่อย FFT ที่แก้ไขจากรหัสของคุณ:

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

ถ้าคุณรู้ว่าคุณต้องการแกนที่แน่นอน

pylab.ylim([0,1000])

ทำงานตามคำตอบก่อนหน้านี้ แต่ถ้าคุณต้องการแกนที่ยืดหยุ่นมากขึ้นเพื่อให้พอดีกับข้อมูลของคุณอย่างที่ฉันทำเมื่อฉันพบคำถามนี้ให้ตั้งค่าขีด จำกัด ของแกนให้เป็นความยาวของชุดข้อมูลของคุณ หากชุดข้อมูลของคุณเป็นfftเหมือนคำถามให้เพิ่มสิ่งนี้หลังจากคำสั่งแปลงของคุณ:

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


0

หากคุณมีหลาย subplots เช่น

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

คุณสามารถใช้ขีด จำกัด y เดียวกันสำหรับพวกเขาทั้งหมด มันได้รับขีด จำกัด ของขวาน y จากพล็อตแรก

plt.setp(ax, ylim=ax[0,0].get_ylim())
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.