質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3109閲覧

3Dグラフがはみ出る

tsuji__

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/22 00:47

#質問 
次の図に示すように3Dグラフがはみ出しているのを修正したいです。

#現状の画像イメージ説明

#コード

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 10 11def FFTparameter(Fs,N): 12 fmax=int(Fs/2.56)#最大周波数 13 Line=int(N/2.56)#ライン数 14 dt=1/Fs#サンプリング間隔 15 df=fmax/Line 16 t=np.arange(0,N*dt,dt)#時間軸 17 freq=np.arange(0,Line*df,df)#周波数軸 18 return fmax,Line,dt,df,t,freq 19 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 43Fs=8192 44N=8192 45overlap=50 46 47#flattop_window = signal.flattop(N) # フラットトップ窓 48hanning_window = np.hanning(N) # ハン窓 49#rec_window=signal.boxcar(N)#レクタンギュラ窓 50 51matdata = scipy.io.loadmat('SweepSignalFs8192.mat') 52wavedata=np.array(matdata['Data']).squeeze() 53 54fmax,Line,dt,df,t,freq=FFTparameter(Fs,N) 55#F_ave,N_ave=wave_FFT(wavedata,Fs,N,dt,overlap,hanning_window) 56#print(len(wavedata)*dt) 57 58 59x1,y1,z1=wave1_FFT(wavedata,N,df,Fs,overlap,hanning_window) 60X,Y=np.meshgrid(x1,y1) 61Z=np.array(z1) 62 63 64fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection' : '3d'}) 65ax.set_xlim(0.0,200) 66ax.set_xticks(np.linspace(0.0, 200, 11)) 67ax.set_ylim(0.0,80.0) 68ax.set_yticks(np.linspace(0.0, 80.0, 9)) 69ax.set_zticks(np.linspace(0.0,0.1,3)) 70ax.set_xlabel("Frequency [Hz]",fontsize=20) 71ax.set_ylabel("Time [s]",fontsize=20) 72ax.set_zlabel("Mag [m/s^2,0-p]",fontsize=20) 73ax.plot_wireframe(X,Y,Z) 74 75ax.view_init(elev=70, azim=270) 76plt.savefig('Waterfall_example.png')

#考えたこと
ax.plot.wireframe(X[0:200],Y,Z)と制限をかけてみたものの、出力結果変わらず
X>200の領域において線の色を透明にして見えなくすることを試みるも出力結果は変わらず
パラメータをいじることなくグラフの一部を非表示にするコマンドというのは何かあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

etherbeg

2021/04/23 01:50

X, Y, Zに想定されているような値が本当に格納されているか、一度出力して確認してみてはいかがでしょうか。 あと160Hz付近に縦に直線上の描画がありますがこれは正常ですか?
tsuji__

2021/04/23 03:03

定義域外のグラフのはみ出しは修正できましたが、160hzの直線描画についてはこちらの意図では無いので解決策を検討します。
guest

回答1

0

自己解決

X[X>200]=np.nanを記述することでグラフがはみでなくなりました。

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')

投稿2021/04/23 03:01

tsuji__

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問