Python, Matplotlib, Subplot: Wie stelle ich den Achsenbereich ein?

265

Wie kann ich den Bereich der y-Achse des zweiten Unterplots auf z. B. [0,1000] einstellen? 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 auswirkung. 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()

Andere Verbesserungen werden ebenfalls geschätzt!

jemand
quelle

Antworten:

284

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

 pylab.ylim([0,1000])

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

jemand
quelle
3
Immer wenn ich das mache, werden die Bilder auf den Kopf gestellt.
ely
1
Wenn ich dies mit Hexbin verwende, wird ylim verwendet, nachdem plot () auf beiden Plots weißen Hintergrund zeigt
lynxoid
3
Was ist, wenn Sie nicht Plot verwenden, sondern savefig?
Ben
8
Rufen Sie plot()dann ylim()und dann an savefig().
Therealrootuser
112

Die Verwendung von Achsenobjekten ist hierfür ein guter Ansatz. Es ist hilfreich, wenn Sie mit mehreren Figuren und Nebenhandlungen 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()
ʀᴏʙ
quelle
2
Wie Rob vorschlägt, wird die OO-Schnittstelle in Matplotlib der zustandsbasierten Pylab-Schnittstelle vorgezogen. "Obwohl viele Beispiele Pylab verwenden, wird dies nicht mehr empfohlen. Für nicht interaktives Plotten wird empfohlen, Pyplot zum Erstellen der Figuren und dann die OO-Schnittstelle zum Plotten zu verwenden." matplotlib.org/faq/…
Bennett Brown
26

Manchmal möchten Sie wirklich die Achsengrenzen festlegen, bevor Sie die Daten zeichnen. In diesem Fall können Sie die Funktion "Autoscaling" für das Objekt Axesoder festlegen AxesSubplot. Die Funktionen von Interesse sind set_autoscale_on, set_autoscalex_onund set_autoscaley_on.

In Ihrem Fall möchten Sie die Grenzen der y-Achse einfrieren, aber die x-Achse erweitern lassen, um Ihre Daten aufzunehmen. Daher möchten Sie die autoscaley_onEigenschaft in ändern False. 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))
andrewtinka
quelle
0

Wenn Sie die gewünschte Achse genau kennen, dann

pylab.ylim([0,1000])

funktioniert wie zuvor beantwortet. Wenn Sie jedoch eine flexiblere Achse wünschen, die genau zu Ihren Daten passt, wie ich es bei der Beantwortung dieser Frage getan habe, legen Sie die Achsenbegrenzung auf die Länge Ihres Datensatzes fest. Wenn Ihr Datensatz dem fftin der Frage entspricht, fügen Sie diesen nach Ihrem Plotbefehl hinzu:

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

Christian Seitz
quelle
0

Wenn Sie mehrere Nebenhandlungen haben, z

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

Sie können für alle die gleichen y-Grenzwerte verwenden. Es erhält Grenzen von y ax aus dem ersten Plot.

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