2010-05-17 14 views
231

Comment puis-je définir la plage de l'axe y de la deuxième sous-plage secondaire par ex. [0,1000]? Le tracé FFT de mes données (une colonne dans un fichier texte) génère un pic (inf.?) De sorte que les données réelles ne sont pas visibles.Python, Matplotlib, sous-placette: Comment définir la plage d'axes?

pylab.ylim([0,1000]) 

n'a aucun effet, malheureusement. C'est 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!

+0

Voir aussi http://stackoverflow.com/questions/15858192/how-to-set-xlim-and-ylim-for-a-subplot-in-matplotlib/15858264? Noredirect = 1 – tacaswell

Répondre

256

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

pylab.ylim([0,1000]) 

Note: La commande doit être exécutée après l'intrigue!

+2

Chaque fois que je fais cela, il retourne les images à l'envers. – ely

+1

si j'utilise ceci avec hexbin, utilise ylim après plot() expose fond blanc sur les deux parcelles – lynxoid

+3

WHat si vous n'utilisez pas l'intrigue, mais savefig ?? – Ben

24

Parfois, vous voulez vraiment définir les limites d'axes avant vous tracez les données. Dans ce cas, vous pouvez définir la fonction "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 y, mais autoriser l'expansion de l'axe x pour accommoder 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 FFT intrigue secondaire à 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)) 
99

L'utilisation axes objects est une bonne approche pour cela. Cela aide si vous voulez interagir avec plusieurs figures et sous-parcelles. Pour ajouter et de manipuler les axes des objets directement:

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

Comme le suggère Rob, l'interface OO de 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 chiffres, puis l'interface OO pour le traçage." https://matplotlib.org/faq/usage_faq.html#matplotlib-pyplot-and-pylab-how-are-they-related –