前提・実現したいこと
csvファイルからデータを読み込み、そのデータをFFT処理を行い、グラフ化するプログラムを作成しています。下図のような状況です。グラフ表示(FFT後)について、グラフ表示のための改善についてご協力をお願いします。
発生している問題・エラーメッセージ
エラーメッセージは出ないのですが、グラフがプロットされていない状態で出力されます。
エラーメッセージ
該当のソースコード
python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4df=pd.read_csv("/data/python検証.csv") 5N=len(df) 6fs=50000 7#時間軸のデータ作成 8t=np.arange(0,N*(1/fs),1/fs) 9 10#周波数軸のデータ作成 11fq=np.linspace(0,1.0/fs,N) 12for i in range(200,1550,50): 13 14 #2次元配列から1次元配列に変更 15 data=df[str(i)+"[Hz]"].values 16 17 #グラフ表示(元) 18 plt.figure(figsize=(6,4)) 19 plt.plot(t,data) 20 plt.title(str(i)+"[Hz]") 21 plt.xlabel("time[s]",fontsize=14) 22 plt.ylabel("signal intensity",fontsize=14) 23 plt.show() 24 25 #読み込んだデータをフーリエ変換 26 data_FFT=np.fft.fft(data) 27 #FFTの複素数結果を絶対値に変換 28 data_FFT_abs=abs(data_FFT) 29 #print(str(i)+"[Hz]"+str(data_FFT)) 30 #print(str(i)+"[Hz]:\n"+str(data_FFT_abs)) 31 32 #グラフ表示(FFT後) 33 plt.figure(figsize=(6,4)) 34 plt.title(str(i)+"[Hz]") 35 plt.plot(fq[:int(N/2)+1],data_FFT_abs[:int(N/2)+1]) 36 plt.xlabel("frequency[Hz]",fontsize=14) 37 plt.ylabel("signal intensity",fontsize=14) 38 plt.xlim(0,2000) 39 plt.show() 40 if i==1500: 41 break
試したこと
グラフ表示(元)はプロットされた状態でグラフが出力されています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
「#グラフ表示(FFT後)」の次の行で「print(fq[:int(N/2)+1],data_FFT_abs[:int(N/2)+1])」を入れて出力を確認するとどうなってますか?
データが入ってないか、plt.xlim(0,2000) で制限してるxの範囲にデータがないのではないでしょうか。
「plt.xlim(0,2000)」を消してみてください
指示して頂いた通りにやってみたところ、上記(試したことを参照してください)のようになりました。
依然として、プロットはされていませんでした。
Jupyter Notebook であればカーネルリスタートしてください
fs=50000
fq=np.linspace(0,1.0/fs,N)
だと、fqの最大値は 1/50000=0.00002 です
plt.xlim(0,2000) だと、ほぼ0ですね
【追記】t=np.arange(0,N*(1/fs),1/fs)
から考えて、
fq=np.linspace(0,fs,N)
でしょうね
jbpb0 さんに :+1:。xlimit 変えたら出てきました。
data_FFT_abs=abs(data_FFT)の後に
print(data_FFT_abs)を入力すると数字は表示されますか?
もし、数字が出るのなら、一旦、
plt.plot(fq,data_FFT_abs)でプロットを試してみてはいかがですか?
icemanstandingさん
> 一旦、plt.plot(fq,data_FFT_abs)でプロットを試して
それが「試したこと」の2つ目のグラフです
横軸の最大値が 1/50000/2=0.00001 になってます
回答1件
あなたの回答
tips
プレビュー