【问题标题】:Plotting Multiple Plots on a single figure from within a for loop - Python从 for 循环中在单个图形上绘制多个图 - Python
【发布时间】:2017-09-05 10:17:25
【问题描述】:

我已经查看了对这个问题的回复:How would I iterate over a list of files and plot them as subplots on a single figure?

但我对如何实现我的目标并不明智。我想将具有不同 x 轴的多个数据集绘制到 Python 中的单个图形上。我在下面包含了我的代码的 sn-p,它对数据集执行 FFT,然后计算 3 个 Butterworth 滤波器输出。理想情况下,我希望将所有内容都绘制在一个数字上,我试图在下面的代码中实现这一点。 for 循环计算 3 个 Butterworth 滤波器输出,上面的代码 - FFT 和下面的代码尝试将 FFT 曲线和 sqrt(0.5) 线附加到先前生成的图中以进行显示。

任何方向或建议将不胜感激。

"""Performs a Fast Fourier Transform on the data specified at the base of the code"""
def FFT(col):
    x = io2.loc[1:,'Time']
    y = io2.loc[1:,col]
    # Number of samplepoints
    #N = 600
    N = pd.Series.count(x)
    N2 = int(N/2)
    # sample spacing
    #T = 1.0 / 800.0
    T = 1/(io2.loc[2,'Time'] - io2.loc[1,'Time'])
    #x = np.linspace(0.0, N*T, N)
    #y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
    yf = scipy.fftpack.fft(y)
    xf = np.linspace(0.0, 1.0/(2.0*T), N2)

fig=plt.figure()
plt.clf()
i=1
for order in [3, 6, 9]:
    ax=fig.add_subplot(111, label="order = %d" % order)
    b, a = butter_lowpass(cutoff, fs, order=order)
    w, h = freqz(b, a, worN=2000)

    ax.plot((fs * 0.5 / np.pi) * w, abs(h))
    i=i+1

ax4=fig.add_subplot(111, label='sqrt(0.5)', frame_on=False)
ax5=fig.add_subplot(111, label="FFT of "+col, frame_on=False)

ax4.plot([0, 0.5 * fs], [np.sqrt(0.5), np.sqrt(0.5)], '--')
ax5.plot(xf, 2.0/N * np.abs(yf[:N2]))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain')
plt.grid(True)
plt.legend(loc='best')

#fig, ax = plt.subplots()
#ax.plot(xf, 2.0/N * np.abs(yf[:N2]), label="FFT of "+col)
plt.axis([0,5000,0,0.1])
#plt.xlabel('Frequency (Hz)')
#plt.ylabel('Amplitude (mm)')
#plt.legend(loc=0)
plt.show()

return

亲切的问候,

【问题讨论】:

    标签: python-3.x matplotlib plot


    【解决方案1】:

    在这里您可以找到一个最小示例,说明如何使用不同的 xy 数据集绘制多条线。每次键入 add_subplot(111) 时,您都在重新创建绘图。相反,您应该多次致电plot。我添加了一个包含多行的单个图的示例,以及每行一个子图的示例。

    import numpy as np
    import matplotlib.pyplot as plt
    
    x1 = np.arange(0, 10, 1)
    x2 = np.arange(3, 12, 0.1)
    x3 = np.arange(2, 8, 0.01)
    
    y1 = np.sin(x1)
    y2 = np.cos(x2**0.8)
    y3 = np.sin(4.*x3)**3
    
    data = []
    data.append((x1, y1, 'label1'))
    data.append((x2, y2, 'label2'))
    data.append((x3, y3, 'label3'))
    
    # All lines in one plot.
    plt.figure()
    for n in data:
        plt.plot(n[0], n[1], label=n[2])
    plt.legend(loc=0, frameon=False)
    
    # One subplot per data set.
    cols = 2
    rows = len(data)//2 + len(data)%2
    plt.figure()
    gs = plt.GridSpec(rows, cols)
    for n in range(len(data)):
        i = n%2
        j = n//2
        plt.subplot(gs[j,i])
        plt.plot(data[n][0], data[n][1])
        plt.title(data[n][2])
    plt.tight_layout()
    plt.show()
    

    【讨论】:

    • 谢谢,如果我将过滤器功能拆分成单独的部分,您发布的代码可以工作,我还没有在最初发布的循环结构中尝试过。是否可以使用此方法为每条线和图例添加标签?我再次尝试让它发挥作用,但没有成功。
    • 我用图例详细说明了这个例子。也许解压缩命令(星号)让你感到困惑。
    • 太好了,再次感谢您。不需要太多让我感到困惑,但老实说我没有注意到星号。我认为我将不得不谷歌这个解压缩命令。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2019-06-30
    • 2018-03-16
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多