it-swarm.com.de

Python, Matplotlib, Subplot: Wie wird der Achsenbereich eingestellt?

Wie kann ich den y-Achsenbereich des zweiten Unterplots auf z. [0,1000]? Das FFT-Diagramm meiner Daten (eine Spalte in einer Textdatei) führt zu einer (inf.?) Spitze, sodass die tatsächlichen Daten nicht sichtbar sind.

pylab.ylim([0,1000])

hat leider keine wirkung. Das ist das ganze Skript:

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

Weitere Verbesserungen sind ebenfalls erwünscht!

253
someone

Wie in http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspx gefunden

 pylab.ylim([0,1000])

Hinweis: Der Befehl muss nach dem Plot ausgeführt werden!

276
someone

Die Verwendung von Achsobjekte ist hierfür ein guter Ansatz. Es ist hilfreich, wenn Sie mit mehreren Figuren und Untergrundstücken interagieren möchten. So fügen Sie die Achsenobjekte direkt hinzu und bearbeiten sie:

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
ʀᴏʙ

Manchmal möchten Sie wirklich die Achsengrenzen festlegen vor Sie zeichnen die Daten. In diesem Fall können Sie die Funktion "Automatische Skalierung" für das Objekt Axes oder AxesSubplot festlegen. Die Funktionen von Interesse sind set_autoscale_on, set_autoscalex_on und set_autoscaley_on.

In Ihrem Fall möchten Sie die Grenzen der y-Achse einfrieren, die x-Achse jedoch erweitern, um Ihre Daten aufzunehmen. Daher möchten Sie die Eigenschaft autoscaley_on in False ändern. Hier ist eine modifizierte Version des FFT-Subplot-Snippets aus Ihrem 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