web-dev-qa-db-fra.com

Python, Matplotlib, sous-parcelle: Comment définir la plage des axes?

Comment puis-je définir la plage d'axe y de la deuxième sous-parcelle sur p. Ex. [0,1000]? Le tracé FFT de mes données (une colonne dans un fichier texte) résulte en un pic (inf.?) De sorte que les données réelles ne sont pas visibles.

pylab.ylim([0,1000])

n'a aucun effet, malheureusement. Ceci est le script entier:

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

D'autres améliorations sont également appréciées!

253
someone

Comme indiqué dans http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx

 pylab.ylim([0,1000])

Remarque: La commande doit être exécutée après le tracé!

276
someone

Utiliser objets axes est une excellente approche pour cela. Il est utile d’interagir avec plusieurs figures et sous-parcelles. Pour ajouter et manipuler directement les objets des axes:

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()
107
ʀᴏʙ

Parfois, vous voulez vraiment définir les limites des axes avant vous tracez les données. Dans ce cas, vous pouvez définir la fonctionnalité "autoscaling" de l'objet Axes ou AxesSubplot. Les fonctions d'intérêt sont set_autoscale_on, set_autoscalex_on et set_autoscaley_on.

Dans votre cas, vous souhaitez geler les limites de l'axe des y, tout en permettant à l'axe des x de se développer pour accueillir vos données. Par conséquent, vous souhaitez modifier la propriété autoscaley_on en False. Voici une version modifiée de l'extrait de sous-parcelle FFT à partir de votre 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))
26
andrewtinka