前回、アヤメデータを散布図として描画することができました!
では、今回は前回描画した散布図を3D散布図として描画してみましょう!
⑦3D散布図で描画しよう
3つの特徴量を使って3D散布図を表示してみましょう!
前回表示した散布図では品種データが重なってしまい違いを詳しく確認できません。
しかし、3D散布図を用いることで違う境界線を発見することができるかもしれません!
今回は「がくの幅」「がくの長さ」「花びらの長さ」の3つの特徴量を使います!
「from mpl_toolkits.mplot3d import Axes3D」でAxes3Dをインポートして、3D空間を作り、そこに散布図を描画しましょう!
コード
#1 sepal width(cm)列を1つ目の対象にする
#2 sepal length(cm)列を2つ目の対象にする
#3 petal length(cm)列を3つ目の対象にする
#4 グラフにX軸ラベルを設定
#5 グラフにY軸ラベルを設定
#6 グラフにZ軸ラベルを設定
## 1~3これがないと3D散布図が表示されない
from mpl_toolkits.mplot3d import Axes3D
xx = "sepal width (cm)" #1
yy = "sepal length (cm)" #2
zz = "petal length (cm)" #3
fig = plt.figure(figsize=(5, 5)) ##1
ax = Axes3D(fig) ##2
fig.add_axes(ax) ##3
ax.scatter(df0[xx], df0[yy], df0[zz], color="c")
ax.scatter(df1[xx], df1[yy], df1[zz], color="m")
ax.scatter(df2[xx], df2[yy], df2[zz], color="y")
ax.set_xlabel(xx) #4
ax.set_ylabel(yy) #5
ax.set_zlabel(zz) #6
plt.show()
参考資料:Python3年生機械学習のしくみ
実行結果
これで3次元のグラフを表示させることができました!
##1~3の
fig = plt.figure(figsize=(5, 5))
ax = Axes3D(fig)
fig.add_axes(ax)
がないと実行結果として
「<Figure size 500×500 with 0 Axes>」が表示され、散布図が描画されません。
忘れないように注意しましょう!
しかし、実行結果のグラフを見るとまだ、2種類の点が混ざっていますね…。
ここで重要になってくるのが「視点」です!
視点が違えばまた違う角度からグラフを見ることができます!
もしかしたら境界線が見えてくるかもしれません!
ax.view_init(縦角度,横角度)で視点を変えてみましょう。
今回は横に240度変更してみます。
コード
ax = Axes3D(plt.figure(figsize=(5, 5)))
ax.scatter(df0[xx], df0[yy], df0[zz], color="c")
ax.scatter(df1[xx], df1[yy], df1[zz], color="m")
ax.scatter(df2[xx], df2[yy], df2[zz], color="y")
ax.set_xlabel(xx)
ax.set_ylabel(yy)
ax.set_zlabel(zz)
ax.view_init(0, 240) #視点を変更
plt.show()
参考資料:Python3年生機械学習のしくみ
実行結果
この角度から見ると、3つの品種を分ける境界線を引くことができそうですね!
おまけになりますが、また違う視点で見ると3D散布図を2D散布図としてみることもできます!
コード
fig = plt.figure(figsize=(5, 5))
ax = Axes3D(fig)
fig.add_axes(ax)
ax.scatter(df0[xx], df0[yy], df0[zz], color="c")
ax.scatter(df1[xx], df1[yy], df1[zz], color="m")
ax.scatter(df2[xx], df2[yy], df2[zz], color="y")
ax.set_xlabel(xx)
ax.set_ylabel(yy)
ax.set_zlabel(zz)
ax.view_init(90, 270) # 視点を変更
plt.show()
参考資料:Python3年生機械学習のしくみ
実行結果
2D散布図にとても似ていますね!
確認問題1
同じデータを用いて、「sepal width (cm)」列を1つ目の対象に、「sepal length (cm)」列を2つ目の対象にし、5×5の青と赤と緑の散布図を半透明にして同じ散布図上に表示するプログラムを作成しましょう。
答えはコチラをクリック!
答え:
xx = "sepal width (cm)"
yy = "sepal length (cm)"
plt.figure(figsize=(5, 5))
plt.scatter(df0[xx], df0[yy], color="b", alpha=0.5)
plt.scatter(df1[xx], df1[yy], color="r", alpha=0.5)
plt.scatter(df2[xx], df2[yy], color="g", alpha=0.5)
plt.xlabel(xx)
plt.ylabel(yy)
plt.grid()
plt.show()
参考資料:Python3年生機械学習のしくみ
確認問題2
確認問題1で作成したプログラムに「petal length (cm)」列を3つ目に追加し、3D散布図のプログラムを作成してみましょう。
答えはコチラをクリック!
答え:
from mpl_toolkits.mplot3d import Axes3D
xx = "sepal width (cm)"
yy = "sepal length (cm)"
zz = "petal length (cm)"
fig = plt.figure(figsize=(5, 5))
ax = Axes3D(fig)
fig.add_axes(ax)
ax.scatter(df0[xx], df0[yy], df0[zz], color="b")
ax.scatter(df1[xx], df1[yy], df1[zz], color="r")
ax.scatter(df2[xx], df2[yy], df2[zz], color="g")
ax.set_xlabel(xx)
ax.set_ylabel(yy)
ax.set_zlabel(zz)
plt.show()
確認問題3
確認問題3で作成した3D散布図を2Dの散布図のように表示するプログラムを作成しましょう。
答えはコチラをクリック!
答え:
fig = plt.figure(figsize=(5, 5))
ax = Axes3D(fig)
fig.add_axes(ax)
ax.scatter(df0[xx], df0[yy], df0[zz], color="b")
ax.scatter(df1[xx], df1[yy], df1[zz], color="r")
ax.scatter(df2[xx], df2[yy], df2[zz], color="g")
ax.set_xlabel(xx)
ax.set_ylabel(yy)
ax.set_zlabel(zz)
ax.view_init(90, 270)
plt.show()
これでアヤメの品種データの処理を行うことができました。
sklearnに入っている実際のデータを処理できるようにはなりましたが、次回からはsklearnの機能を利用してサンプルデータを自動生成してみましょう!