matplotlib 如何设置子图轴范围

92vpleto  于 2023-06-23  发布在  其他
关注(0)|答案(6)|浏览(102)

如何将第二子图的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()

其他改进也值得赞赏!

dpiehjr4

dpiehjr41#

你有pylab.ylim

pylab.ylim([0,1000])

注意:命令必须在绘图后执行!

2021年更新

由于matplotlib现在强烈不鼓励使用pylab,因此您应该使用pyplot:

from matplotlib import pyplot as plt
plt.ylim(0, 100) 
#corresponding function for the x-axis
plt.xlim(1, 1000)
xn1cxnb4

xn1cxnb42#

使用axes objects是一个很好的方法。如果您想与多个图形和子图交互,它会有所帮助。要直接添加和操纵轴对象,请执行以下操作:

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

nhhxz33t3#

有时候你真的想在绘制数据之前设置轴的限制。在这种情况下,您可以设置AxesAxesSubplot对象的“自动缩放”功能。感兴趣的函数是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))
8zzbczxx

8zzbczxx4#

如果您有多个子图,即

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

您可以对所有对象使用相同的y限制。它从第一个图得到y轴的极限。

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

mpgws1up5#

如果你知道你想要的确切轴,那么
pylab.ylim([0,1000])
如前所述。但是,如果你想要一个更灵活的轴来拟合你的确切数据,就像我发现这个问题时所做的那样,那么将轴限制设置为数据集的长度。如果您的数据集是fft,如问题中所示,则在plot命令之后添加该命令:
length = (len(fft)) pylab.ylim([0,length])

icnyk63a

icnyk63a6#

也可以在向现有图形示例添加子图时设置ylim/xlimplt.subplot允许ylim=参数)。

import numpy as np
import matplotlib.pyplot as plt

xs = np.arange(1000)                             # sample data
rawsignal = np.random.rand(1000)
fft = np.fft.fft(rawsignal)

plt.figure(figsize=(9,6))                        # create figure
plt.subplots_adjust(hspace=0.4)

plt.subplot(2, 1, 1, title='Signal')             # first subplot
plt.plot(xs, rawsignal)

plt.subplot(2, 1, 2, title='FFT', ylim=(0,100))  # second subplot
#                                 ^^^^^  <---- set ylim here
plt.plot(abs(fft));

而且,使用面向对象的接口不那么冗长,也更清晰。Axes示例定义了set()方法,可以用来设置一系列属性,包括y-limit/title等。

fig, (ax1, ax2) = plt.subplots(2, figsize=(9,6))
ax1.plot(xs, rawsignal)                # plot rawsignal in the first Axes
ax1.set(title='Signal')                # set the title of the first Axes
ax2.plot(abs(fft))                     # plot FFT in the second Axes
ax2.set(ylim=(0, 100), title='FFT');   # set title and y-limit of the second Axes

两组代码产生相同的以下输出。

相关问题