Python, Matplotlib, alt grafik: Eksen aralığı nasıl ayarlanır?


266

İkinci alt grafiğin y ekseni aralığını örneğin [0,1000] olarak nasıl ayarlayabilirim? Verilerimin FFT grafiği (metin dosyasındaki bir sütun), gerçek verilerin görünmemesi için (inf.?) Artışına neden olur.

pylab.ylim([0,1000])

maalesef bir etkisi yok. Tüm senaryo bu:

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

Diğer iyileştirmeler de takdir edilmektedir!


Yanıtlar:



112

Eksen nesnelerini kullanmak bunun için harika bir yaklaşımdır. Birden çok şekil ve alt grafikle etkileşime girmek istiyorsanız yardımcı olur. Eksen nesnelerini doğrudan eklemek ve değiştirmek için:

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'un da belirttiği gibi, matplotlib'deki OO arayüzü, durum tabanlı pylab arayüzü yerine tercih edilir. "Birçok örnekte pylab kullanılmasına rağmen, artık önerilmemektedir. Etkileşimli olmayan çizim için, şekiller oluşturmak için pyplot ve sonra çizim için OO arabirimi kullanılması önerilir." matplotlib.org/faq/…
Bennett Brown

26

Bazen verileri çizmeden önce eksen sınırlarını gerçekten ayarlamak istersiniz . Bu durumda, Axesveya AxesSubplotnesnesinin "otomatik ölçeklendirme" özelliğini ayarlayabilirsiniz . İlgi fonksiyonları set_autoscale_on, set_autoscalex_onve set_autoscaley_on.

Sizin durumunuzda, y ekseni sınırlarını dondurmak istiyorsunuz, ancak x ekseninin verilerinizi alacak şekilde genişlemesine izin verin. Bu nedenle, autoscaley_onözelliği olarak değiştirmek istiyorsunuz False. Kodunuzdan FFT alt grafiği snippet'inin değiştirilmiş bir sürümü:

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

İstediğiniz ekseni tam olarak biliyorsanız,

pylab.ylim([0,1000])

daha önce cevaplandığı gibi çalışır. Ancak, bu soruyu bulduğumda yaptığım gibi kesin verilerinize uyması için daha esnek bir eksen istiyorsanız, eksen sınırını veri kümenizin uzunluğu olarak ayarlayın. Veri kümeniz fftsorudaki gibi ise, bunu plot komutundan sonra ekleyin:

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


0

Birden fazla alt alanınız varsa, yani

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

Hepsi için aynı y sınırlarını kullanabilirsiniz. İlk grafikten y baltasının sınırlarını alır.

plt.setp(ax, ylim=ax[0,0].get_ylim())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.