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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

解決済

Pythonでの3Dグラフの表示方法

tsuji__
tsuji__

総合スコア10

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

1回答

0リアクション

0クリップ

2234閲覧

投稿2021/04/20 07:08

#質問
Pythonで3Dのウォーターフォール線図の作成を試みているのですが、3Dプロットが表示されず困っています。
#コード

Python

import numpy as np import scipy.io import matplotlib.pyplot as plt from scipy import fftpack def FFTparameter(Fs,N): fmax=int(Fs/2.56)#最大周波数 Line=int(N/2.56)#ライン数 dt=1/Fs#サンプリング間隔 df=fmax/Line t=np.arange(0,N*dt,dt)#時間軸 freq=np.arange(0,Line*df,df)#周波数軸 return fmax,Line,dt,df,t,freq def ov_FFT(data,samplerate,Fs,overlap,window): Ts = len(data) / samplerate Fc = Fs / samplerate x_ol = Fs * (1 - (overlap/100)) N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) array = [] for i in range(N_ave): ps = int(x_ol * i) array.append(data[ps:ps+Fs:1]) array_window=array*window F = fftpack.fft(array_window) Famp=np.abs(F) F_total=np.sum(Famp,axis=0) F_average=F_total / Fs*2 F_average=F_average/N_ave acf=1/(sum(window)/Fs) F_average=acf*F_average return F_average, N_ave def wave_FFT(data,samplerate,Fs,dt,overlap,window): for j in range(int(N*dt)): Ts = len(data) / samplerate Fc = Fs / samplerate x_ol = Fs * (1 - (overlap/100)) N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) array = [] for i in range(N_ave): ps = int(x_ol * i) array.append(data[ps:ps+Fs:1]) array_window=array*window F = fftpack.fft(array_window) Famp=np.abs(F) F_average=Famp / Fs*2 F_average=F_average/N_ave acf=1/(sum(window)/Fs) F_average=acf*F_average return F_average, N_ave Fs=8192 N=8192 overlap=50 #flattop_window = signal.flattop(N) # フラットトップ窓 hanning_window = np.hanning(N) # ハン窓 #rec_window=signal.boxcar(N)#レクタンギュラ窓 matdata = scipy.io.loadmat('SweepSignalFs8192.mat') wavedata=np.array(matdata['Data']).squeeze() fmax,Line,dt,df,t,freq=FFTparameter(Fs,N) F_ave,N_ave=wave_FFT(wavedata,Fs,N,dt,overlap,hanning_window) x=np.arange(0,200,200/N_ave) y=np.arange(0,N*dt,dt) X,Y=np.meshgrid(x,y) Z=F_ave fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'}) ax.set_xticks(np.linspace(0.0, 200.0, 11)) ax.set_yticks(np.linspace(0.0, 80, 9)) ax.set_xlabel("Frequency [Hz]") ax.set_ylabel("Time [s]") ax.set_zlabel("Mag [m/s$^{^2}$,$_{0-p}$]") plt.plot(x, y, Z, c='b') plt.show()

#参考URL
次に示すURLを参考にして3D表示を試みてみました。Python 3 3次元グラフの書き方(matplotlib, pyplot, mplot3d, MPL)
Matplotlibを使用してOriginのウォーターフォールプロットを模倣する

#実際のエラーコード

Python

Reloaded modules: makegraph, analysisfunction Traceback (most recent call last): ValueError: 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次元リストを作成すると容量が重くなりメモリエラーが出てしまいました。
情報は以上になります。細かい値の設定などはともかく、まずはイメージに近いグラフを出力させたいと考えています。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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