2017-09-05 25 views
1

が、私はこの質問への応答を検討している:How would I iterate over a list of files and plot them as subplots on a single figure?は、forループ内からの単一の図に複数のプロットをプロット - Pythonの

は、しかし、私の目標を達成するためにどのように賢く何もしていません。異なるx軸を持つ複数のデータセットをPythonの1つのFigureにプロットしたいと思います。私はデータセットに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 

種類よろしく、ここで

答えて

0

ますが、別のXYデータセットを持つ複数の行をプロットする方法の最小限の例を見つけることができます。 add_subplot(111)と入力するたびにプロットが再作成されます。代わりに、plotに複数回電話する必要があります。私は、複数の行を持つ単一のプロットの例と、行ごとに1つのサブプロットの例を追加しました。

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

私はフィルター機能を個々の部分に分割すると、あなたが投稿したコードが機能しますが、私はまだ最初に投稿したループ構造内で試していません。この方法を使用して、各行と凡例にラベルを追加することは可能ですか?再び私はこれをうまく動作させることができなかった。 – chopboy

+0

私は伝説の例を詳述しました。おそらくunzipコマンド(アスタリスク)があなたを混乱させました。 – Chiel

+0

よかった、もう一度ありがとう。 私を混乱させることはあまりありませんが、正直言って私はアスタリスクに気付かなかったのです。私はこの解凍コマンドをGoogleにgoogleする必要があります。 – chopboy

関連する問題