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

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

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

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

Q&A

解決済

1回答

1389閲覧

ワイヤーフレームにおける線の非表示

tsuji__

総合スコア11

Python

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

0グッド

0クリップ

投稿2021/04/26 04:17

#質問
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

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

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

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

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

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

etherbeg

2021/04/26 06:11

import numpy as np import scipy.io import matplotlib.pyplot as plt from scipy import signal from scipy import fftpack from mpl_toolkits.mplot3d import Axes3D from matplotlib import mathtext import matplotlib as mpl X = np.array([ 0, 1.30719, 2.61438, 3.92157, 5.22876, 6.53595, 7.84314, 9.15033, 10.4575, 11.7647, 13.0719, ]) Y = np.array([ 0, 0.00012207, 0.000244141, 0.000366211, 0.000488281, 0.000610352, 0.000732422, 0.000854492, 0.000976562, 0.00109863, ]) Z = np.array([ [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,], ]) def wave_plot(xmin,xmax,ymin,ymax,zmin,zmax,ver,hor,savename): fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection' : '3d'}) mpl.rcParams["font.size"] = 20 mpl.rcParams['axes.labelpad'] = 20 ax.set_xlim(xmin,xmax) ax.set_xticks(np.linspace(xmin, xmax, 11)) ax.set_ylim(ymin,ymax) ax.set_yticks(np.linspace(ymin, ymax, 9)) ax.set_zticks(np.linspace(zmin,zmax,3)) ax.set_xlabel("Frequency [Hz]") ax.set_ylabel("Time [s]") ax.set_zlabel("Mag [m/s$^{^2},_{0-p}$]") ax.plot_wireframe(X,Y,Z,color='black') ax.view_init(elev=ver, azim=hor) plt.savefig(savename) wave_plot(0.0,200,0.0,80,0.0,0.10,60,270,'wavetest.png') 上記のプログラムで試したところ、以下のエラーが出たのですが、どこが間違っているでしょうか。 Traceback (most recent call last): File "/Users/xxxxx/main.py", line 120, in <module> wave_plot(0.0,200,0.0,80,0.0,0.10,60,270,'wavetest.png') File "/Users/xxxxx/main.py", line 98, in wave_plot ax.plot_wireframe(X,Y,Z,color='black') File "/Users/xxxxx/.venv/lib/python3.9/site-packages/matplotlib/_api/deprecation.py", line 431, in wrapper return func(*inner_args, **inner_kwargs) File "/Users/xxxxx/.venv/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 1898, in plot_wireframe X, Y, Z = np.broadcast_arrays(X, Y, Z) File "<__array_function__ internals>", line 5, in broadcast_arrays File "/Users/xxxxx/.venv/lib/python3.9/site-packages/numpy/lib/stride_tricks.py", line 538, in broadcast_arrays shape = _broadcast_shape(*args) File "/Users/xxxxx/.venv/lib/python3.9/site-packages/numpy/lib/stride_tricks.py", line 420, in _broadcast_shape b = np.broadcast(*args[:32]) ValueError: shape mismatch: objects cannot be broadcast to a single shape
guest

回答1

0

自己解決

質問してから自分でも調べた結果、

Python

1ax.plot_wireframe(X,Y,Z,color='black') 23ax.plot_wireframe(X,Y,Z,color='black',ccount=1)

と変更することで上手くいきました。
実際には縦線が消えたというより、ccountの値を調節することで縦線の本数を1本にしているようです。
(1本の縦線は0Hzに存在する模様)
ちなみに横線の本数を設定するのはrcountと使うと良いらしいです。イメージ説明

投稿2021/04/26 07:33

tsuji__

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問