282 votes

Python, Matplotlib, subplot : comment définir l'étendue de l'axe ?

Comment puis-je définir la plage de l'axe des y du deuxième sous-graphe à [0,1000] par exemple ? 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. Voici l'ensemble du 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 !

0 votes

0 votes

Cela répond-il à votre question ? définition de la limite de l'axe des y dans matplotlib

297voto

someone Points 1211

Vous avez pylab.ylim :

pylab.ylim([0,1000])

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

Mise à jour 2021
Depuis l'utilisation de pylab est maintenant fortement déconseillée par matplotlib vous devriez plutôt utiliser pyplot :

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

4 votes

A chaque fois que je fais ça, ça renverse les images.

1 votes

Si je l'utilise avec hexbin, l'utilisation de ylim après plot() expose le fond blanc sur les deux tracés.

3 votes

Et si vous n'utilisez pas plot, mais savefig ?

118voto

Rob Points 551

Utilisation de objets de l'axe est une excellente approche pour cela. Elle est utile si vous souhaitez interagir avec plusieurs figures et sous-plans. Pour ajouter et manipuler directement les objets d'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()

2 votes

Comme le suggère Rob, l'interface OO de matplotlib est préférable à l'interface pylab basée sur les états. "Bien que de nombreux exemples utilisent pylab, ce 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 le traçage. " matplotlib.org/faq/

27voto

andrewtinka Points 358

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

Dans votre cas, vous voulez geler les limites de l'axe des y, mais permettre à l'axe des x de s'étendre pour s'adapter à vos données. Par conséquent, vous voulez modifier l'option autoscaley_on à la propriété False . Voici une version modifiée de l'extrait du sous-réseau 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))

0voto

Christian Seitz Points 376

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

pylab.ylim([0,1000])

fonctionne comme répondu précédemment. Mais si vous voulez un axe plus flexible pour s'adapter à vos données exactes, comme je l'ai fait lorsque j'ai trouvé cette question, alors définissez la limite de l'axe comme étant la longueur de votre ensemble de données. Si votre ensemble de données est fft comme dans la question, puis ajoutez ceci après votre commande plot :

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

0voto

Jsowa Points 4130

Si vous avez plusieurs intrigues secondaires, c'est à dire

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

Vous pouvez utiliser les mêmes limites d'âge pour toutes ces personnes. Il obtient les limites de l'axe des ordonnées à partir du premier tracé.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X