2010-05-17 16 views
231

Jak ustawić zakres osi y drugiego subplota np. [0,1000]? Wykres FFT moich danych (kolumna w pliku tekstowym) powoduje skok (inf.?), Tak że rzeczywiste dane nie są widoczne.Python, Matplotlib, subplot: Jak ustawić zakres osi?

pylab.ylim([0,1000]) 

niestety nie daje efektu. To jest cały skrypt:

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

Udoskonalono także inne ulepszenia!

+0

zobaczyć również http://stackoverflow.com/questions/15858192/how-to-set-xlim-and-ylim-for-a-subplot-in-matplotlib/15858264? Noredirect = 1 – tacaswell

Odpowiedz

24

Czasami naprawdę chcesz ustawić ograniczenia osi przed możesz wykreślić dane. W takim przypadku można ustawić funkcję "automatycznego skalowania" obiektu Axes lub AxesSubplot. Interesujące funkcje to set_autoscale_on, set_autoscalex_on i set_autoscaley_on.

W twoim przypadku chcesz zablokować limity osi Y, ale pozwól, aby oś X się rozszerzyła, aby pomieścić Twoje dane. Dlatego chcesz zmienić właściwość autoscaley_on na False. Tutaj jest zmodyfikowaną wersją FFT subplot urywka z kodu:

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

Korzystanie axes objects jest wielki podejście do tego. Pomaga, jeśli chcesz wejść w interakcję z wieloma liczbami i sub-działkami. Aby dodawać i manipulować osie obiektów bezpośrednio:

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

Zgodnie z sugestią Roberta, interfejs OO w matplotlib jest preferowany w porównaniu z interfejsem pylab opartym na stanie. "Chociaż wiele przykładów korzysta z pylab, nie jest to już zalecane, w przypadku nieinteraktywnego kreślenia sugeruje się użycie pyplot do utworzenia rysunków, a następnie interfejsu OO do kreślenia." https://matplotlib.org/faq/usage_faq.html#matplotlib-pyplot-and-pylab-how-are-they-related –

Powiązane problemy