Python, Matplotlib, subplot: Hoe het asbereik instellen?

Hoe kan ik het y-asbereik van de tweede subplot instellen op b.v. [0,1000] ?
De FFT-plot van mijn gegevens (een kolom in een tekstbestand) resulteert in een (inf.?) piek zodat de werkelijke gegevens niet zichtbaar zijn.

pylab.ylim([0,1000])

heeft helaas geen effect. Dit is het hele 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()

Andere verbeteringen worden ook op prijs gesteld!


Antwoord 1, autoriteit 100%

Je hebt pylab.ylim:

pylab.ylim([0,1000])

Opmerking: het commando moet na de plot worden uitgevoerd!

Update 2021
Aangezien het gebruik van pylab nu sterk wordt afgeraden door matplotlib, moet u in plaats daarvan pyplot gebruiken:

from matplotlib import pyplot as plt
plt.ylim(0, 100) 
#corresponding function for the x-axis
plt.xlim(1, 1000)

Antwoord 2, autoriteit 40%

Het gebruik van axes-objectenis hiervoor een uitstekende benadering. Het helpt als je met meerdere figuren en subplots wilt communiceren. Om de assenobjecten direct toe te voegen en te manipuleren:

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

Antwoord 3, autoriteit 9%

Soms wil je echt de assenlimieten instellen voordatje de gegevens plot. In dat geval kunt u de functie “autoscaling” van het object Axesof AxesSubplotinstellen. De interessante functies zijn set_autoscale_on, set_autoscalex_onen set_autoscaley_on.

In jouw geval wil je de limieten van de y-as bevriezen, maar de x-as laten uitbreiden om plaats te bieden aan je gegevens. Daarom wilt u de eigenschap autoscaley_onwijzigen in False. Hier is een aangepaste versie van het FFT-subplotfragment uit uw code:

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

Antwoord 4

Als u de exacte as weet die u wilt, dan

pylab.ylim([0,1000])

werkt zoals eerder beantwoord. Maar als u een flexibelere as wilt die bij uw exacte gegevens past, zoals ik deed toen ik deze vraag vond, stel dan de aslimiet in op de lengte van uw gegevensset. Als uw dataset fftis zoals in de vraag, voeg dan dit toe na uw plotopdracht:

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


Antwoord 5

Als je meerdere subplots hebt, bijv.

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

Je kunt voor allemaal dezelfde y-limieten gebruiken. Het krijgt limieten van y axe vanaf de eerste plot.

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

Other episodes