[英]How to set the subplot axis range
如何将第二个子图的 y 轴范围设置为 [0,1000]? 我的数据(文本文件中的一列)的 FFT plot 导致(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()
其他改进也表示赞赏!
你有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)
使用轴对象是一个很好的方法。 如果您想与多个图形和子图进行交互,它会有所帮助。 要直接添加和操作坐标区对象:
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()
有时您真的想在绘制数据之前设置坐标区限制。 在这种情况下,您可以设置Axes
或AxesSubplot
对象的“自动缩放”功能。 感兴趣的函数是set_autoscale_on
、 set_autoscalex_on
和set_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))
如果你知道你想要的确切轴,那么
pylab.ylim([0,1000])
像以前一样工作。 但是如果你想要一个更灵活的轴来适应你的确切数据,就像我发现这个问题时所做的那样,那么将轴限制设置为你的数据集的长度。 如果您的数据集是问题中的fft
,则在您的绘图命令之后添加以下内容:
length = (len(fft)) pylab.ylim([0,length])
如果你有多个子图,即
fig, ax = plt.subplots(4, 2)
您可以对所有这些使用相同的 y 限制。 它从第一个图中获得 y 轴的限制。
plt.setp(ax, ylim=ax[0,0].get_ylim())
也可以在向现有图形实例添加子图时设置ylim
/ xlim
( plt.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
两组代码都产生相同的以下 output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.