しぷぜん

しぷぜん

素人プログラマなおいがStep Zero to Oneしていくブログ

Pythonでデータを可視化するmatplotlib初級(3D散布図編)

こんにちは、なおいです。

いくらか記事が脱線もしましたが、 matplotlibというライブラリで2Dのグラフをこれまで描いてきました。3次元のも描いときたいなと呟いたと思いますが早速3次元プロットについて書いていきます。 

 

ct-innovation01.hateblo.jp

 

 

 

 f:id:ct-innovation01:20170927160405p:plain

 

3次元散布図グラフのプロット

1.基本
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [1, 2, 3, 4, 5]
y = [1, 8, 3, 6, 5]
z = [1, 5, 3, 8, 9]

ax.scatter(x, y, z)
plt.show()

他のサイトと同様に、numpyを導入してランダムにポイントを作成して散布図らしくすることも考えましたが、急にいろんなものを入れるとどれがプロットに必要なのか不明瞭になると思ったので出来るだけ簡素にしてみました。

赤文字が3次元でのプロットを行うために追加で必要になったコードです。

プロットした結果は以下の通りで、xとyとzがそれぞれ、配列になっていて、(x[0], y[0], z[0])にプロットしてくれるため(1,1,1)となり、そのあとも同じインデックス同士の(2,8,5)、(3,3,3)、(4,6,8)、(5,5,9)とプロットされていきます。

 

f:id:ct-innovation01:20171007121022p:plain

 

問題なくプロットされてます。3次元プロットになってからこの表示されたグラフにも特別な機能が付きます。なんと、ドラッグで回ります。

 

f:id:ct-innovation01:20171005153227g:plain

 

はい、どうでもいいですね。失礼しました。では、いつも通り見た目をカスタマイズしていきます。

その前にちょっと寄り道

いろんなサイトを調べてると以下のコードを結構見かけます。これについて少し調べてみましたが、これは以前は使われていたけど最近のバージョンではあまり推奨されてないやり方との事です。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
2.プロットの見た目をいじる
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [1, 2, 3, 4, 5]
y = [1, 8, 3, 6, 5]
z = [1, 5, 3, 8, 9]

ax.scatter(x, y, z, c='r', marker='^', label='test')
ax.legend()
plt.show()

赤文字部を追加してマーカーの色と形の変更を行いました。主要なカスタマイズキーワードは2次元散布図の時とほぼ同様ですが、わざわざそちらのページに行きたくないと思うので今回も表形式でグラフの後に載せときます。

 

f:id:ct-innovation01:20171007121146p:plain

 

次はグラフタイトルとX軸Y軸のラベル等を入れましょう。

 

 

 

Tips)プロットに付与できる主要なカスタマイズキーワード

いつも通り最低限これだけおさえてれいれば、普通のグラフは書けるかなという範囲のみ記載しておきます。

kywd 入力例 備考
x,y,z [1,2,3,4,5] または 事前に定義したlistなど array形式のもの
※必須
s s=5 または
x,yと同範囲のリスト(要素はサイズ)
マーカーの大きさ
指定しないと20
c c="red" または
c="#FFFF00" または
c=(1.0,0,1.0)
マーカーの色
色名や16進数、RGBでの指定が可能
marker marker="." マーカーの形
指定しないと○
*は星形など様々指定可
alpha alpha=0.3 マーカーの透明度
指定は0-1の間で行う
linewidths linewidths=2 マーカーの枠線の幅
label label="label1" 凡例名

色と形については、リファレンスを見ると以下のものが用意されているみたいです。

f:id:ct-innovation01:20170927115343p:plain

color example code: named_colors.py — Matplotlib 2.0.2 documentation

f:id:ct-innovation01:20170927115403p:plainf:id:ct-innovation01:20170927115416p:plain

lines_bars_and_markers example code: marker_reference.py — Matplotlib 2.0.2 documentation

 

3.グラフの見た目をいじる
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [1, 2, 3, 4, 5]
y = [1, 8, 3, 6, 5]
z = [1, 5, 3, 8, 9]

ax.scatter(x, y, z, c='r', marker='^', label='test')
ax.legend()
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

先ほど同様、赤文字部を追加することで見た目のカスタマイズを行いました。今回は、グリッド線をより細かく指定しています。実際のグラフが以下のものです。

 

f:id:ct-innovation01:20171008190456p:plain

 

では、最後に2Dとの組み合わせができるかどうかを実験的にやってみて閉めましょうかね。

 

4.一つのグラフに折れ線グラフと3D散布図を重ねてプロットする
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [1, 2, 3, 4, 5]
y = [1, 8, 3, 6, 5]
z = [1, 5, 3, 8, 9]

ax.scatter(x, y, z, c='r', marker='^', label='test')
plt.plot(x,y,label='test',linewidth=3,color='b',
          marker='^',markeredgecolor="black")
ax.legend()
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

前回、「同じグラフにプロットするだけならただもう一行追加するだけでいい。」と書きましたが、これはがまさか2次元と3次元の組み合わせでも効くとは。。。

 

f:id:ct-innovation01:20171008190901p:plain

 

なんか普通にかけて拍子抜けしました。