#質問
Pythonで3Dのウォーターフォール線図の作成を試みているのですが、3Dプロットが表示されず困っています。
#コード
Python
1import numpy as np 2import scipy.io 3import matplotlib.pyplot as plt 4from scipy import fftpack 5 6 7def FFTparameter(Fs,N): 8 fmax=int(Fs/2.56)#最大周波数 9 Line=int(N/2.56)#ライン数 10 dt=1/Fs#サンプリング間隔 11 df=fmax/Line 12 t=np.arange(0,N*dt,dt)#時間軸 13 freq=np.arange(0,Line*df,df)#周波数軸 14 return fmax,Line,dt,df,t,freq 15 16def ov_FFT(data,samplerate,Fs,overlap,window): 17 Ts = len(data) / samplerate 18 Fc = Fs / samplerate 19 x_ol = Fs * (1 - (overlap/100)) 20 N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) 21 array = [] 22 for i in range(N_ave): 23 ps = int(x_ol * i) 24 array.append(data[ps:ps+Fs:1]) 25 array_window=array*window 26 F = fftpack.fft(array_window) 27 Famp=np.abs(F) 28 F_total=np.sum(Famp,axis=0) 29 F_average=F_total / Fs*2 30 F_average=F_average/N_ave 31 acf=1/(sum(window)/Fs) 32 F_average=acf*F_average 33 return F_average, N_ave 34 35def wave_FFT(data,samplerate,Fs,dt,overlap,window): 36 for j in range(int(N*dt)): 37 Ts = len(data) / samplerate 38 Fc = Fs / samplerate 39 x_ol = Fs * (1 - (overlap/100)) 40 N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) 41 array = [] 42 for i in range(N_ave): 43 ps = int(x_ol * i) 44 array.append(data[ps:ps+Fs:1]) 45 array_window=array*window 46 F = fftpack.fft(array_window) 47 Famp=np.abs(F) 48 49 F_average=Famp / Fs*2 50 F_average=F_average/N_ave 51 acf=1/(sum(window)/Fs) 52 F_average=acf*F_average 53 return F_average, N_ave 54 55Fs=8192 56N=8192 57overlap=50 58 59#flattop_window = signal.flattop(N) # フラットトップ窓 60hanning_window = np.hanning(N) # ハン窓 61#rec_window=signal.boxcar(N)#レクタンギュラ窓 62matdata = scipy.io.loadmat('SweepSignalFs8192.mat') 63wavedata=np.array(matdata['Data']).squeeze() 64 65fmax,Line,dt,df,t,freq=FFTparameter(Fs,N) 66F_ave,N_ave=wave_FFT(wavedata,Fs,N,dt,overlap,hanning_window) 67 68 69x=np.arange(0,200,200/N_ave) 70y=np.arange(0,N*dt,dt) 71X,Y=np.meshgrid(x,y) 72Z=F_ave 73fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'}) 74ax.set_xticks(np.linspace(0.0, 200.0, 11)) 75ax.set_yticks(np.linspace(0.0, 80, 9)) 76ax.set_xlabel("Frequency [Hz]") 77ax.set_ylabel("Time [s]") 78ax.set_zlabel("Mag [m/s$^{^2}$,$_{0-p}$]") 79plt.plot(x, y, Z, c='b') 80plt.show()
#参考URL
次に示すURLを参考にして3D表示を試みてみました。Python 3 3次元グラフの書き方(matplotlib, pyplot, mplot3d, MPL)
Matplotlibを使用してOriginのウォーターフォールプロットを模倣する
#実際のエラーコード
Python
1Reloaded modules: makegraph, analysisfunction 2 3Traceback (most recent call last): 4 5 6ValueError: input operand has more dimensions than allowed by the axis remapping
このエラーがplt.plot(x, y, Z, c='b')の行で発生してしまい、グラフを表示させることができません。
#出力画像のイメージ
#グラフ用データ
全て公開するのは量的に非現実的なので、一部だけ抜粋します。各値に書いてあるデータ数は本来のデータの個数になります。
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
#試したこと
3次元リストも試してみたのですが、3次元リストを作成すると容量が重くなりメモリエラーが出てしまいました。
情報は以上になります。細かい値の設定などはともかく、まずはイメージに近いグラフを出力させたいと考えています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/22 00:25