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!


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!


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

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

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])


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())
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.