pythonで3Dプロット

今回はpythonにて3dのプロットを行いたいと思います。
使うのはmpl_toolkits.mplot3dのAxes3Dというメソッドです。
表面を滑らかにプロットするplot_surfaceというのでプロットしたいと思います。
まずは簡単な例
$$z=x^2+y^2$$
をプロットしてみましょう。
必要なものをインポート
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

次に\(z\)を返すメソッド

def func1(x,y):
 return x**2+y**2

後はメインでデータの準備とプロット処理

if __name__ == '__main__':
 x = np.arange(-30,30,1)
 y = np.arange(-30,30,1)
 X, Y = np.meshgrid(x, y)
 Z = func1(X,Y)
 fig = plt.figure()
 ax = Axes3D(fig)
 ax.set_xlabel("x")
 ax.set_ylabel("y")
  ax.set_zlabel("f(x, y)")
  ax.plot_surface(X, Y, Z,cmap='bwr', linewidth=0)
  plt.show()

これでこんな感じのグラフがぐりぐりできると思います。

オンラインで3dグラフを共有する方法もあるそうなので、また紹介します。

では次は音声の振幅スペクトルをプロットしてみます。

importに以下を追加

from scipy.signal import chirp, spectrogram
from matplotlib import cm

今回はスイープ信号を窓をずらしながらフーリエ変換して、その変化を見てみます。

スイープ信号をpythonで作成する方法は以下の記事で解説しています。

メインに以下を追加しましょう。

N = 8192
fs = 48000#サンプリング周波数
t = np.linspace(0, 10, fs*10)
w = chirp(t, f0=0, f1=20000, t1=10, method='linear')#スイープ信号の生成
t = np.arange(0, N/fs, 1/fs) # 時間軸
freq = np.linspace(0, fs/2, int(N/2)-1) # 周波数軸
move = int(N)#移動量
x = np.arange(0,int((len(w)-move)/move),1)#フーリエ変換の回数分の配列を用意する。
X, FREQ = np.meshgrid(x, freq)
start = 0
hamming = np.hamming(N)#ハミング窓を用意する
Z = np.empty(int(N/2)-1)
for i inrange(int((len(w)-move)/move)-1):
    data = w[start:start+N]#波形の抽出
    spec = np.fft.fft(data*hamming)#窓をかけてフーリエ変換
    Z = np.vstack((Z, abs(spec[1:int(N/2)])))#Zに追加
    start += move#移動量分スタートをずらす
"""以下はプロット処理"""
fig = plt.figure()
ax = Axes3D(fig)
ax.set_xlabel("x")
ax.set_ylabel("freq")
ax.set_zlabel("f(x, y)")
ax.plot_surface(X, FREQ, Z.T, cmap=cm.coolwarm,linewidth=0)
plt.show()

分かりにくいかもしれませんが、ピークが遷移しています。

これは単なるスペクトログラムの3d化ですので、あまり使えるかわからないですけど

見やすくて面白いと思います。

みなさんもぜひ色んなデータを見やすくしてみてください。

pythonのグラフ描画はmatplotlibとseabornが定番。

以下の書籍で詳しく解説されています。

Sponsored Link

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です