Python、Matplotlib、子绘图:如何设置轴范围?

Python、Matplotlib、子绘图:如何设置轴范围?,python,range,axis,matplotlib,Python,Range,Axis,Matplotlib,如何将第二个子批次的y轴范围设置为例如[01000]? 我的数据的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 = []

如何将第二个子批次的y轴范围设置为例如[01000]? 我的数据的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()
其他改进也非常感谢

您有:

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

更新2021
因为,您应该改为使用pyplot:

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

有时,您确实希望在绘制数据之前设置轴限制。在这种情况下,可以设置
轴子图
对象的“自动缩放”功能。感兴趣的功能有
set\u autoscale\u on
set\u autoscalex\u on
set\u autoscaley\u on

在本例中,您希望冻结y轴的限制,但允许x轴展开以容纳数据。因此,您需要将上的
autoscaley\u属性更改为
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))
使用是一个很好的方法。如果您想与多个图形和子图交互,它会有所帮助。要直接添加和操作轴对象,请执行以下操作:

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

如果你知道你想要的确切轴,那么

pylab.ylim([01000])

工作原理如前所述。但是,如果您想要一个更灵活的轴来适合您的精确数据,就像我发现这个问题时所做的那样,那么将轴限制设置为数据集的长度。如果您的数据集是问题中的
fft
,则在plot命令后添加:

length=(len(fft))

pylab.ylim([0,length])
如果您有多个子批次,即

fig, ax = plt.subplots(4, 2)
您可以对它们使用相同的y限制。它从第一个图中得到y ax的极限

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

每当我这样做时,它都会将图像翻转过来。如果我将其与hexbin一起使用,则在plot()曝光两个绘图上的白色背景后使用ylim。如果您不使用plot,而是使用savefig??调用
plot()
,然后调用
ylim()
,然后使用
savefig()
。这是否回答了您的问题?正如Rob所建议的,matplotlib中的OO接口比基于状态的pylab接口更受欢迎。虽然许多示例使用pylab,但不再推荐使用它。对于非交互式打印,建议使用pyplot创建图形,然后使用OO界面进行打印
plt.setp(ax, ylim=ax[0,0].get_ylim())