Python、Matplotlib、subplot:軸の範囲を設定する方法は?


266

2番目のサブプロットのy軸の範囲をたとえば[0,1000]に設定するにはどうすればよいですか?データ(テキストファイルの列)のFFTプロットにより、(inf。?)スパイクが発生し、実際のデータが表示されなくなります。

pylab.ylim([0,1000])

残念ながら影響はありません。これはスクリプト全体です:

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

その他の改善も高く評価されています!


回答:


284

http://www.mofeel.net/582-comp-soft-sys-matlab/54166.aspxにあるとおり

 pylab.ylim([0,1000])

注:コマンドはプロットの後に実行する必要があります!


3
これを行うと、画像が上下逆になります。
11

1
hexbinでこれを使用する場合、plot()が両方のプロットで白い背景を公開した後にylimを使用します
lynxoid

3
plotを使用していないが、savefigを使用している場合は?
ベン

8
を呼び出しplot()、それからそれylim()からsavefig()
therealrootuser 2015

112

これには、Axesオブジェクトを使用するのが最適です。複数の図やサブプロットを操作したい場合に役立ちます。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
Robが示唆するように、matplotlibのOOインターフェイスは、状態ベースのpylabインターフェイスよりも優先されます。「多くの例ではpylabを使用していますが、これは推奨されていません。非インタラクティブなプロットの場合は、pyplotを使用して図を作成してから、プロット用のOOインターフェイスを作成することをお勧めします。」matplotlib.org/faq/…–
ベネットブラウン

26

データをプロットする前に、本当に軸の範囲を設定したい場合があります。その場合、AxesまたはAxesSubplotオブジェクトの「自動スケーリング」機能を設定できます。興味のある機能がありset_autoscale_onset_autoscalex_onset_autoscaley_on

あなたのケースでは、y軸の制限を固定したいが、x軸がデータに対応するように拡張できるようにします。したがって、autoscaley_onプロパティをに変更しますFalse。以下は、コードからのFFTサブプロットスニペットの修正バージョンです。

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

必要な正確な軸がわかっている場合は、

pylab.ylim([0,1000])

以前に答えたように動作します。ただし、この質問を見つけたときに行ったように、より柔軟な軸を使用して正確なデータに合わせる場合は、軸の制限をデータセットの長さに設定します。データセットがfft質問のとおりの場合は、プロットコマンドの後にこれを追加します。

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


0

複数のサブプロットがある場合、つまり

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

それらすべてに同じy制限を使用できます。最初のプロットからy axの制限を取得します。

plt.setp(ax, ylim=ax[0,0].get_ylim())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.