पायथन, मैटलोट्लिब, सबप्लॉट: अक्ष रेंज कैसे सेट करें?


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

अन्य सुधार भी सराहना कर रहे हैं!


इसके अलावा stackoverflow.com/questions/15858192/…
tacaswell

जवाबों:


284

जैसा कि http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx में पाया गया

 pylab.ylim([0,1000])

नोट: कमांड को प्लॉट के बाद निष्पादित किया जाना है!


3
जब भी मैं ऐसा करता हूं, यह छवियों को उल्टा कर देता है।
एली

1
अगर मैं हेक्सबिन के साथ इसका उपयोग करता हूं, तो प्लॉट के बाद यालिम का उपयोग करता है () दोनों भूखंडों पर सफेद पृष्ठभूमि को उजागर करता है
lynxoid

3
अगर आप प्लॉट का उपयोग नहीं कर रहे हैं, लेकिन savefig ??
बेन

8
कॉल करो plot(), तब ylim()और फिर savefig()
उपचारकर्ता

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
जैसा कि रॉब का सुझाव है, Matplotlib में OO इंटरफ़ेस राज्य-आधारित पायलैब इंटरफ़ेस पर पसंद किया जाता है। "हालांकि कई उदाहरण pylab का उपयोग करते हैं, यह अब अनुशंसित नहीं है। गैर-संवादात्मक साजिश रचने के लिए यह सुझाव दिया जाता है कि आंकड़े बनाने के लिए pyplot का उपयोग करें और फिर साजिश रचने के लिए OO इंटरफ़ेस।" matplotlib.org/faq/…
बेनेट ब्राउन

26

कभी-कभी आप डेटा को प्लॉट करने से पहले वास्तव में कुल्हाड़ियों की सीमा निर्धारित करना चाहते हैं । उस स्थिति में, आप ऑब्जेक्ट Axesया AxesSubplotऑब्जेक्ट की "ऑटोस्कोलिंग" सुविधा सेट कर सकते हैं । ब्याज की कार्य हैं set_autoscale_on, set_autoscalex_on, और set_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

यदि आपके पास कई सबप्लॉट हैं, अर्थात

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

आप उन सभी के लिए एक ही y सीमा का उपयोग कर सकते हैं। यह पहले प्लॉट से y ax की सीमा प्राप्त करता है।

plt.setp(ax, ylim=ax[0,0].get_ylim())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.