Python, Matplotlib, subplot: Comment définir la plage d'axe?

266

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

pylab.ylim([0,1000])

n'a aucun effet, malheureusement. Voici tout le 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()

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

Quelqu'un
la source
Voir également stackoverflow.com/questions/15858192/…
tacaswell

Réponses:

284

Tel que trouvé 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é!

Quelqu'un
la source
3
Chaque fois que je fais cela, il retourne les images à l'envers.
le
1
si j'utilise ceci avec hexbin, utilise ylim après plot () expose un fond blanc sur les deux parcelles
lynxoid
3
Que faire si vous n'utilisez pas plot, mais savefig ??
Ben
8
Appelez plot(), puis ylim()puis savefig().
therealrootuser
112

L'utilisation d' objets axes est une excellente approche pour cela. Cela aide si vous souhaitez interagir avec plusieurs figures et sous-parcelles. Pour ajouter et manipuler directement les objets 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()
ʀᴏʙ
la source
2
Comme le suggère Rob, l'interface OO dans matplotlib est préférée à l'interface pylab basée sur l'état. "Bien que de nombreux exemples utilisent pylab, il n'est plus recommandé. Pour le traçage non interactif, il est suggéré d'utiliser pyplot pour créer les figures, puis l'interface OO pour tracer." matplotlib.org/faq/…
Bennett Brown
26

Parfois, vous voulez vraiment définir les limites des axes avant de tracer les données. Dans ce cas, vous pouvez définir la fonction "mise à l'échelle automatique" de l' objet Axesou AxesSubplot. Les fonctions d'intérêt sont set_autoscale_on, set_autoscalex_onet set_autoscaley_on.

Dans votre cas, vous souhaitez figer les limites de l'axe y, mais permettre à l'axe x de se développer pour accueillir vos données. Par conséquent, vous souhaitez modifier la autoscaley_onpropriété en False. Voici une version modifiée de l'extrait de sous-tracé FFT 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))
andrewtinka
la source
0

Si vous connaissez l'axe exact que vous voulez, alors

pylab.ylim([0,1000])

fonctionne comme indiqué précédemment. Mais si vous souhaitez un axe plus flexible pour s'adapter à vos données exactes, comme je l'ai fait lorsque j'ai trouvé cette question, définissez la limite d'axe sur la longueur de votre ensemble de données. Si votre jeu de données est fftcomme dans la question, ajoutez ceci après votre commande de tracé:

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

Christian Seitz
la source
0

Si vous avez plusieurs sous-parcelles, c.-à-d.

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

Vous pouvez utiliser les mêmes limites y pour chacun d'eux. Il obtient les limites de y ax à partir de la première parcelle.

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