2010-05-17 19 views
231

Come posso impostare l'intervallo dell'asse y della seconda sottotrama ad es. [0,1000]? Il grafico FFT dei miei dati (una colonna in un file di testo) produce un picco (inf.?) In modo che i dati effettivi non siano visibili.Python, Matplotlib, sottotrama: come impostare l'intervallo dell'asse?

pylab.ylim([0,1000]) 

non ha alcun effetto, purtroppo. Questo è l'intero script:

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

Anche altri miglioramenti sono apprezzati!

+0

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

risposta

256

come si trova nel http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx

pylab.ylim([0,1000]) 

Nota: il comando deve essere eseguita dopo la trama!

+2

Ogni volta che lo faccio, capovolge le immagini capovolte. – ely

+1

se lo uso con hexbin, usa ylim after plot() espone lo sfondo bianco su entrambi i grafici – lynxoid

+3

WHAT se non stai usando la trama, ma savefig ?? – Ben

24

A volte si desidera veramente impostare i limiti degli assi prima di si trame i dati. In tal caso, è possibile impostare la funzione di "scalabilità automatica" dell'oggetto Axes o AxesSubplot. Le funzioni di interesse sono set_autoscale_on, set_autoscalex_on e set_autoscaley_on.

Nel proprio caso, si desidera bloccare i limiti dell'asse y, ma consentire all'asse x di espandersi per adattarsi ai dati. Pertanto, si desidera modificare la proprietà autoscaley_on a False. Ecco una versione modificata del FFT sottotrama frammento di dal codice:

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

Utilizzando axes objects è un ottimo approccio per questo. Aiuta se vuoi interagire con più figure e sotto-trame. Per aggiungere e manipolare gli assi oggetti direttamente:

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

Come suggerisce Rob, l'interfaccia OO in matplotlib è preferita all'interfaccia pylab basata sullo stato. "Sebbene molti esempi utilizzino pylab, non è più raccomandato. Per il plottaggio non interattivo si consiglia di utilizzare pyplot per creare le figure e quindi l'interfaccia OO per la stampa." https://matplotlib.org/faq/usage_faq.html#matplotlib-pyplot-and-pylab-how-are-they-related –

Problemi correlati