前回、アヤメデータを散布図として描画することができました!
では、今回は前回描画した散布図を3D散布図として描画してみましょう!
⑦3D散布図で描画しよう
3つの特徴量を使って3D散布図を表示してみましょう!
前回表示した散布図では品種データが重なってしまい違いを詳しく確認できません。
しかし、3D散布図を用いることで違う境界線を発見することができるかもしれません!
![](https://momotech-dao.com/wp-content/uploads/2024/06/image-2-1024x515.png)
今回は「がくの幅」「がくの長さ」「花びらの長さ」の3つの特徴量を使います!
「from mpl_toolkits.mplot3d import Axes3D」でAxes3Dをインポートして、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()
#1 sepal width(cm)列を1つ目の対象にする
#2 sepal length(cm)列を2つ目の対象にする
#3 petal length(cm)列を3つ目の対象にする
#4 グラフにX軸ラベルを設定
#5 グラフにY軸ラベルを設定
#6 グラフにZ軸ラベルを設定
## 1~3これがないと3D散布図が表示されない
参考資料:Python3年生機械学習のしくみ
実行結果
![](https://momotech-dao.com/wp-content/uploads/2024/06/image-3.png)
これで3次元のグラフを表示させることができました!
##1~3の
fig = plt.figure(figsize=(5, 5))
ax = Axes3D(fig)
fig.add_axes(ax)
がないと実行結果として
「<Figure size 500×500 with 0 Axes>」が表示され、散布図が描画されません。
忘れないように注意しましょう!
しかし、実行結果のグラフを見るとまだ、2種類の点が混ざっていますね…。
![](https://momotech-dao.com/wp-content/uploads/2024/06/image-8.png)
ここで重要になってくるのが「視点」です!
視点が違えばまた違う角度からグラフを見ることができます!
もしかしたら境界線が見えてくるかもしれません!
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()
実行結果
![](https://momotech-dao.com/wp-content/uploads/2024/06/image-4.png)
この角度から見ると、3つの品種を分ける境界線を引くことができそうですね!
![](https://momotech-dao.com/wp-content/uploads/2024/06/image-10-1024x556.png)
おまけになりますが、また違う視点で見ると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()
実行結果
![](https://momotech-dao.com/wp-content/uploads/2024/06/image-9.png)
2D散布図にとても似ていますね!
これでアヤメの品種データの処理を行うことができました。
sklearnに入っている実際のデータを処理できるようにはなりましたが、次回からはsklearnの機能を利用してサンプルデータを自動生成してみましょう!