Python, Matplotlib, sottotrama: come impostare l'intervallo degli assi?


266

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

pylab.ylim([0,1000])

purtroppo non ha alcun effetto. 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()

Altri miglioramenti sono anche apprezzati!


Risposte:



112

L'uso degli oggetti degli assi è un ottimo approccio per questo. Aiuta se si desidera interagire con più figure e grafici secondari. Per aggiungere e manipolare direttamente gli oggetti degli assi:

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
Come suggerisce Rob, l'interfaccia OO in matplotlib è preferita all'interfaccia pylab basata sullo stato. "Sebbene molti esempi utilizzino pylab, non è più raccomandato. Per la stampa non interattiva si consiglia di utilizzare pyplot per creare le figure e quindi l'interfaccia OO per la stampa." matplotlib.org/faq/…
Bennett Brown l'

26

A volte vuoi davvero impostare i limiti degli assi prima di tracciare i dati. In tal caso, è possibile impostare la funzione di "ridimensionamento automatico" dell'oggetto Axeso AxesSubplot. Le funzioni di interesse sono set_autoscale_on, set_autoscalex_one set_autoscaley_on.

Nel tuo caso, vuoi congelare i limiti dell'asse y, ma consentire all'asse x di espandersi per accogliere i tuoi dati. Pertanto, si desidera modificare la autoscaley_onproprietà in False. Ecco una versione modificata dello snippet della sottotrama FFT dal tuo 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))

0

Se conosci l'asse esatto che desideri, allora

pylab.ylim([0,1000])

funziona come precedentemente risposto. Ma se vuoi che un asse più flessibile si adatti ai tuoi dati esatti, come ho fatto quando ho trovato questa domanda, imposta il limite degli assi sulla lunghezza del tuo set di dati. Se il tuo set di dati è fftcome nella domanda, quindi aggiungi questo dopo il comando trama:

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


0

Se hai più sottotrame, ad es

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

Puoi usare gli stessi limiti y per tutti loro. Ottiene i limiti dell'ascia y dal primo diagramma.

plt.setp(ax, ylim=ax[0,0].get_ylim())
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.