#質問
Pythonでワイヤーフレーム表示をした際に次に示す結果グラフにて約160hz近辺で時間軸上に伸びている線を消去する方法が分からず困っています。
#コード
Python
1import numpy as np 2import scipy.io 3import matplotlib.pyplot as plt 4import makegraph as mg 5import analysisfunction as af 6from scipy import signal 7from scipy import fftpack 8from mpl_toolkits.mplot3d import Axes3D 9from matplotlib import mathtext 10import matplotlib as mpl 11 12def FFTparameter(Fs,N): 13 fmax=int(Fs/2.56)#最大周波数 14 Line=int(N/2.56)#ライン数 15 dt=1/Fs#サンプリング間隔 16 df=fmax/Line 17 t=np.arange(0,N*dt,dt)#時間軸 18 freq=np.arange(0,Line*df,df)#周波数軸 19 return fmax,Line,dt,df,t,freq 20def wave1_FFT(data,samplerate,df,Fs,overlap,window): 21 22 Ts = len(data) / samplerate 23 Fc = Fs / samplerate 24 x_ol = Fs * (1 - (overlap/100)) 25 N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) 26 xdata=np.linspace(0,samplerate,N)#周波数データ 27 ydata=np.linspace(0,len(data)/Fs,N_ave)#時間データ 28 zdata=[]#振幅データ 29 for j in range(N_ave): 30 array = [] 31 ps = int(x_ol * j) 32 array.append(data[ps:ps+N:1]) 33 array_window=array*window 34 F = fftpack.fft(array_window) 35 Famp=np.abs(F) 36 F_total=np.sum(Famp,axis=0) 37 F_average=F_total / Fs*2 38 acf=1/(sum(window)/Fs) 39 F_average=acf*F_average 40 zdata.append(F_average) 41 return xdata,ydata,zdata 42 43def wave_plot(xmin,xmax,ymin,ymax,zmin,zmax,ver,hor,savename): 44 fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection' : '3d'}) 45 mpl.rcParams["font.size"] = 20 46 mpl.rcParams['axes.labelpad'] = 20 47 ax.set_xlim(xmin,xmax) 48 X[X>xmax]=np.nan 49 ax.set_xticks(np.linspace(xmin, xmax, 11)) 50 ax.set_ylim(ymin,ymax) 51 ax.set_yticks(np.linspace(ymin, ymax, 9)) 52 ax.set_zticks(np.linspace(zmin,zmax,3)) 53 ax.set_xlabel("Frequency [Hz]") 54 ax.set_ylabel("Time [s]") 55 ax.set_zlabel("Mag [m/s$^{^2},_{0-p}$]") 56 ax.plot_wireframe(X,Y,Z,color='black') 57 ax.view_init(elev=ver, azim=hor) 58 plt.savefig(savename) 59 60Fs=8192 61N=8192 62overlap=25 63 64#flattop_window = signal.flattop(N) # フラットトップ窓 65hanning_window = np.hanning(N) # ハン窓 66#rec_window=signal.boxcar(N)#レクタンギュラ窓 67 68matdata = scipy.io.loadmat('SweepSignalFs8192.mat') 69wavedata=np.array(matdata['Data']).squeeze() 70fmax,Line,dt,df,t,freq=FFTparameter(Fs,N) 71 72x1,y1,z1=wave1_FFT(wavedata,N,df,Fs,overlap,hanning_window) 73X,Y=np.meshgrid(x1,y1) 74Z=np.array(z1) 75 76wave_plot(0.0,200,0.0,80,0.0,0.10,60,270,'wavetest.png')
#考察
本来は最大周波数が8192hzまであるグラフを一部拡大したもので、160Hz近傍の縦線はワイヤーフレームの一部と考えられるので、ワイヤーフレーム表示以外の表示方法があればそれを試すべきかと考えています。
そのため、今回はax.plot_wireframeの部分をax.plot_lineなどいろいろ試してみたがエラーが発生しました。(どうやらこのようなコマンドは定義されていないみたいでした)
以下にグラフ作成データを載せますので、誰か解決できる方がいらっしゃいましたら宜しくお願い致します。
#グラフ用データ
全て公開するのは量的に非現実的なので、一部だけ抜粋します。各値に書いてあるデータ数は本来のデータの個数になります。
X値 データ数153個 0 1.30719 2.61438 3.92157 5.22876 6.53595 7.84314 9.15033 10.4575 11.7647 13.0719
Y値 データ数8192個 0 0.00012207 0.000244141 0.000366211 0.000488281 0.000610352 0.000732422 0.000854492 0.000976562 0.00109863
Z値 153*8192の2重リスト 0.000101528 4.43029e-05 1.03922e-05 1.70963e-05 2.80585e-05 1.65718e-05 0.000244378 0.00031357 0.000348129 0.00024573 7.65761e-05 3.39492e-05 0.000317529 0.000335056 0.000186748 0.000205272 5.63488e-05 2.78178e-05 0.000240313 0.000222441 0.000156231 0.000105827 6.57634e-05 8.20557e-05 0.000393149 0.000314569 0.000144609 0.000138492 7.77692e-05 1.81025e-05 9.54087e-05 0.000199687 0.000153193 3.83784e-05 7.28451e-05 7.07395e-05 0.000202067 0.000247239 0.000311838 0.000290076 0.000184408 6.8552e-05 0.000312637 0.000431914 0.000233941 0.000116044 2.35009e-05 3.24477e-05 8.87849e-05 0.000143231 0.000240549 0.000200959 0.000100509 4.50792e-05
回答1件
あなたの回答
tips
プレビュー