繁体   English   中英

如何设置子图轴范围

[英]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()

有时您真的想绘制数据之前设置坐标区限制。 在这种情况下,您可以设置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))

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

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 / 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

两组代码都产生相同的以下 output。

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM