今回は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
