何度も3dのScatterPlotでミスをするので、ここで一度基本を押さえておこうと思う。
元ネタは参考①のとおりですが、ミスする箇所はちょっと異なるので記事にしておきます。
元々の使い方は参考②のMatplotlibのドキュメントにあります。
そして、参考③はnp.reshape(X[:,0],-1)の表現のために引用しています。つまり、引数は1次元の変数である必要があります。
【参考】
①matplotlibで3Dプロット
②scatter(xs, ys, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs)@mplot3d API@ matplotlib
③matplotlib.scatter() not working with Numpy on Python 3.6
###今回のコードは以下のとおり
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import matplotlib
print(matplotlib.__version__)
# 3.0.3
#for 3D plotting
from mpl_toolkits.mplot3d import Axes3D
if __name__ == '__main__':
N = 100
X = np.random.rand(N, 3)
y = np.random.rand(N) * 2 - 1
fig = plt.figure()
ax1 = fig.add_subplot(211 , projection='3d')
sc = ax1.scatter(X[:, 0], X[:, 1],zs=X[:, 2],zdir='z', s=50, vmin=0, vmax=1, c=y, cmap=plt.cm.jet)
plt.colorbar(sc)
ax2 = fig.add_subplot(212, projection='3d')
sc2=ax2.scatter3D(np.ravel(X[:, 0]), np.ravel(X[:, 1]), zs=X[:, 2],zdir='z',s=50, vmin=0, vmax=1, c=y, cmap=plt.cm.jet)
plt.colorbar(sc2)
plt.show()
fig = plt.figure()
ax3 = fig.add_subplot(211)
sc3 = ax3.scatter(np.reshape(X[:,0],-1), np.reshape(X[:,1],-1), c=np.reshape(X[:,2],-1), cmap=plt.cm.jet) #cmap=plt.cm.jet cm.seismic plt.cm.Spectral
plt.colorbar(sc3)
ax4 = fig.add_subplot(212, projection='3d')
sc4=ax4.scatter3D(X[:, 0], X[:, 1],c=np.reshape(X[:,2],-1), cmap=plt.cm.jet)
plt.colorbar(sc4)
plt.show()
上記の上のコードが通常よく使う二次元のプロットにカラーで3次元目を表すコードです。
そして、最後のコードでprojection='3d'を指定しないとエラーで描画できません。
※ここが通常のscatterとscater3Dの異なる部分のようです
###まとめ
・3d Scatter Plotについて試してみた
・描画の仕方としてscatterとscatter3Dは3dプロットだと同じ振る舞いをするが、2dプロットの場合はscatterを使う方が見やすい
・おまじないとしてfrom mpl_toolkits.mplot3d import Axes3Dとprojection='3d'がないと3dプロットはできない
・引数はX,Y,Zとcは1ーDである必要があり、np.ravel(X[:, 0])やnp.reshape(X[:,0],-1)などで変換することができる