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!


Respuestas:



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

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

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


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())
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.