Python, Matplotlib, subplot: ¿Cómo configurar el rango del eje?

266

¿Cómo puedo establecer el rango del eje y de la segunda subtrama en, por ejemplo, [0,1000]? El gráfico FFT de mis datos (una columna en un archivo de texto) da como resultado un pico (inf.?) Para que los datos reales no sean visibles.

pylab.ylim([0,1000])

no tiene efecto, desafortunadamente. Este es el guión completo:

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

¡También se aprecian otras mejoras!

alguien
fuente

Respuestas:

284

Como se encuentra en http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx

 pylab.ylim([0,1000])

Nota: ¡El comando debe ejecutarse después de la trama!

alguien
fuente
3
Cada vez que hago esto, voltea las imágenes al revés.
ely
1
si uso esto con hexbin, usa ylim después de que plot () exponga el fondo blanco en ambas parcelas
lynxoid
3
¿QUÉ SUCEDE si no está utilizando plot, sino savefig?
Ben
8
Llama plot(), entonces ylim()y luego savefig().
therealrootuser
112

El uso de objetos de ejes es un gran enfoque para esto. Ayuda si quieres interactuar con múltiples figuras y subtramas. Para agregar y manipular los objetos de los ejes directamente:

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()
ʀᴏʙ
fuente
2
Como sugiere Rob, se prefiere la interfaz OO en matplotlib sobre la interfaz pylab basada en estado. "Aunque muchos ejemplos usan pylab, ya no se recomienda. Para el trazado no interactivo, se sugiere usar pyplot para crear las figuras y luego la interfaz OO para el trazado". matplotlib.org/faq/…
Bennett Brown
26

A veces, realmente desea establecer los límites de los ejes antes de trazar los datos. En ese caso, puede configurar la función de "autoescalado" del objeto Axesu AxesSubplot. Las funciones de interés son set_autoscale_on, set_autoscalex_ony set_autoscaley_on.

En su caso, desea congelar los límites del eje y, pero permitir que el eje x se expanda para acomodar sus datos. Por lo tanto, desea cambiar la autoscaley_onpropiedad a False. Aquí hay una versión modificada del fragmento de subtrama FFT de su código:

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))
andrewtinka
fuente
0

Si conoce el eje exacto que desea, entonces

pylab.ylim([0,1000])

funciona como se respondió anteriormente. Pero si desea un eje más flexible que se ajuste a sus datos exactos, como hice cuando encontré esta pregunta, establezca el límite del eje para que sea la longitud de su conjunto de datos. Si su conjunto de datos es fftcomo en la pregunta, agregue esto después de su comando de trazado:

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

Christian Seitz
fuente
0

Si tiene varias subtramas, es decir

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

Puede usar los mismos límites y para todos ellos. Obtiene límites de y ax desde la primera trama.

plt.setp(ax, ylim=ax[0,0].get_ylim())
Tajni
fuente