【matplotlib】Pythonで3次元(3D)グラフを作成|回転させるよ!
本記事ではその悩みを解決していきます。
実は、Pythonでも、簡単に3次元のグラフを図示することができます。
本記事では、10〜15分程度でPythonのmatplotlibというライブラリを使用して、初心者でも高度な3次元グラフを作成できる方法を説明していきます。
本記事を読むメリット
- Pythonを利用して、さまざまな3次元プロットを作成できるようになる
- 3次元プロットのカスタマイズができるようになる
- Pythonで作成した3次元プロットを回転させ様々な角度から描画できるようになる
Pythonで3次元プロット作成するための準備
まずは、Pythonで3次元プロット作成する準備を行っていきます。
具体的には、以下の流れで行っていきます。
- 使用するパッケージをインポート
- matplotlibの基本を学ぶ(理解している方は飛ばして読んでください)
使用するパッケージをインポート
まずは、使用するパッケージをインポートしていきます。
下記のコードを入力してください。
# 使用するパッケージをインポート
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
今回は、3次元グラフを作成するために『mpl_toolkits.mplot3d
』からAxes3Dをインポートしました(最近は書かなくても大丈夫な場合も多いです。)
また、グラフの具体例を作成するために『numpy
』もインポートしています。
『numpy』の基本が心配という方は、下記の記事を参考にしてください。
matplotlibの基本を学ぶ
3次元グラフ作成でも、matplotlibのカスタマイズ方法をほとんどそのまま適用できます。
そのため、matplotlibのカスタマイズ方法をある程度知っておくと良いです。
matplotlibの基本操作が心配な方は下記を参考にしてください(15分程度で高度なグラフが作成できるようになります)
Pythonで3次元曲線をプロットする方法
次に、Pythonで3次元プロットを作成する方法を説明していきます。
具体的には、下記のステップで説明していきます。
- ウインドウと3次元グラフを作成
- 3次元曲線をプロットする方法
詳しく説明していきます。
ウインドウと3次元グラフを作成
3次元曲面をプロットするためのウインドウ(figureオブジェクト)と3次元グラフ(axオブジェクト)を作成する二つの方法を説明します。
ウインドウと3次元グラフを作成する方法には主に以下の二つがあります。
- ウインドウとグラフを別々に作成
- ウインドウとグラフを同時に作成
詳しく説明していきます。
ウインドウとグラフを別々に作成
ウインドウとグラフを別々に作成する方法には以下のコードを入力してください。
<Input>
# ウインドウとグラフを別々に作成
fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, projection='3d')
<output>
ウインドウとグラフを同時に作成
ウインドウとグラフを同時に作成する場合は、『plt.subplots関数』の引数に『subplot_kw={‘projection’ : ‘3d’}』を設定してください。
# ウインドウとグラフを同時に作成
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
<output>
本記事では、ウインドウとグラフを同時に作成する方法を使用して説明を行っていきます。
3次元曲線をプロットする方法
次に、3次元曲線を具体的にプロットしていきます。
まずは、実際にプロットする関数を準備していきます。
今回は、下記の螺旋を表す関数をプロットしていきます。
<input>
# 図示する関数
t = np.linspace(- 2*np.pi, 2*np.pi)
x = np.cos(t)
y = np.sin(t)
z = t
プロットする方法は、matplotlibと変わらず、『plotメソッド』を使用して、プロットすることができます。
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
ax.plot(x, y, z, c='b')
ax.set_xticks(np.linspace(-1.0, 1.0, 5))
ax.set_yticks(np.linspace(-1.0, 1.0, 5))
plt.show()
<output>
コードを見ていただくとわかると思いますが、プロットラインの色変更や軸メモリの設定はmatplotlibのカスタマイズと全く同じです。
次章では、3次元曲面を作成する方法を説明していきます。
Pythonで3次元曲面をプロットする方法
本章では、3次元曲面をプロットする方法を説明していきます。
具体的には、下記の流れで説明していきます。
- メッシュ(格子点)を作成
- 3次元曲面をプロット : plot_surface
- カラーバーを設定する方法
- ワイヤーを利用し3次元曲面をプロット : plot_wireframe
詳しく解説していきます。
メッシュ(格子点)を作成
3次元曲面を作成するためには、最初にメッシュ(格子点)を作成する必要があります。
理由は、作成したメッシュ(格子点)にz軸の値を対応させて3次元曲面をプロットを行うからです。
メッシュは、numpyの『meshgrid関数』を使用すること簡単に作成できます。
具体例として、4×4の格子点を作成します。
<input>
# メッシュ関数の例
x = np.array([0, 1, 2, 3])
y = np.array([0, 1, 2, 3])
xx, yy = np.meshgrid(x, y)
これで、meshgrid関数を利用し下記のようなメッシュ(格子点)を作成することができました。
実際に、xxとyyを見てみると格子点が作成できていることがわかります。
<input>
print(xx)
print('=========')
print(yy)
<output>
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
=========
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]]
次節では、具体的に3次元曲面をプロットしていきます。
3次元曲面をプロット : plot_surface
まずは、プロットするための具体的な関数を準備します。
今回は、下記の関数を使用します。
# 図示する関数
def func(x, y):
return np.sin(x) * np.sin(y)
3次元曲面をプロットするためには、『plot_surface』を利用します。
では、実際に曲面をプロットしてみましょう。
<input>
# メッシュを作成
x = np.arange(-5.0, 5.0, 0.1)
y = np.arange(-5.0, 5.0, 0.1)
X, Y = np.meshgrid(x, y)
# plot_surfaceで曲面プロット
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
ax.plot_surface(X, Y, func(X, Y), rstride=1, cstride=10, cmap='jet', alpha=0.4)
plt.show()
<output>
plot_surfaceの引数について説明していきます。
plot_surfaceの引数 | |
---|---|
第一引数 | X座標 |
第二引数 | Y座標 |
第三引数 | Z座標 |
rstride, cstride | 各軸に対して何ステップごとにプロットするかを設定 |
cmap | カラーマップを指定 colormapの種類に関してはこちら(公式) |
alpha | 透明度 |
次節では、今回作成したグラフにカラーバーを設定する方法を説明していきます。
カラーバーを設定する方法
本節では、カラーバーを3次元曲面に設定する方法を説明します。
カラーバーは、『colorbarメソッド』をfigureインスタンスに適応することで設定することができます。
<input>
fig, ax = plt.subplots(figsize=(8, 6), subplot_kw={'projection' : '3d'})
surface = ax.plot_surface(X, Y, func(X, Y), rstride=1, cstride=10, cmap='jet', alpha=0.4)
# カラーバーを設定
fig.colorbar(surface, ax=ax, shrink=0.5)
plt.show()
<output>
colobarメソッドの詳しい引数を説明します。
colobarの引数 | |
---|---|
第一引数 | カラーバーを設定したいグラフ |
ax | colorbarを設定したいaxオブジェクト |
shrink | カラーバーの大きさ |
ワイヤーを利用し3次元曲面をプロット : plot_wireframe
『plot_wireframe』を使用することで、ワイヤーを利用して3次元曲面をプロットすることができます。
<input>
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
# plot_wireframeを使用
ax.plot_wireframe(X, Y, Z, linewidth=0.3)
plt.show()
<output>
『plot_wireframeメソッド』の引数を説明します。
plot_wireframe | |
---|---|
第一引数 | X座標の値 |
第二引数 | Y座標の値 |
第三引数 | Z座標の値 |
linewidth | ワイヤーの太さ |
次章では、3次元散布図を作成する方法を紹介していきます。
Pythonで3次元散布図を作成する方法
『scatter3Dメソッド』を使用することで、3次元散布図を作成することができます。
<input>
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
# scatter3Dを使用
ax.scatter3D(X, Y, func(X, Y), s=0.1, color='red', depthshade=True)
plt.show()
<output>
scatter3Dの引数を説明していきます。
scatter3D | |
---|---|
第一引数 | X座標の値 |
第二引数 | Y座標の値 |
第三引数 | Z座標の値 |
s | マーカーのサイズ |
color | マーカーの色 |
depthshade | マーカーに影を作る |
次章では、これまで作成したような3次元グラフを回転する方法を説明します。
3次元グラフを回転させる
『view_initメソッド』をaxオブジェクトに適用することで3次元グラフを回転させることができます。
<input>
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
ax.plot_surface(X, Y,func(X, Y), rstride=1, cstride=10, cmap='jet', alpha=0.3)
# グラフを回転
ax.view_init(elev=10, azim=50)
plt.show()
<output>
『view_init』の引数について解説していきます。
view_init | |
---|---|
elev | 縦方向の回転 |
azim | 横方向の回転 |
もう少し引数について詳しく説明すると、下記のような状態を0度として、縦方向・横方向に何度回転させるかというのが『elev, azim』です。
3次元グラフのカスタマイズ方法
ここからは、3次元グラフのカスタマイズ方法を説明します。
自分が苦戦した部分も整理しておきます。
基本的なカスタマイズ方法(2次元グラフと共通)
通常の2次元グラフと共通するカスタマイズの具体例を紹介します。
# 図示する関数
t = np.linspace(- 2*np.pi, 2*np.pi)
x1, x2 = t - np.sin(t), 1 - np.cos(t)
y1, y2 = 1 - np.cos(t), t - np.sin(t)
z1, z2 = t, 2*t
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection' : '3d'})
ax.plot(x1, y1, z1, c='r', ls='--', label='line1')
ax.plot(x2, y2, z2, c='b', label='line2')
# タイトルを設定
ax.set_title('Sample', size=25)
# 軸ラベルの設定
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
# 軸目盛の設定
ax.set_xticks(np.linspace(-8.0, 8.0, 5))
ax.set_yticks(np.linspace(-8.0, 8.0, 5))
ax.set_zticks(np.linspace(-8.0, 8.0, 5))
# 軸目盛のカスタマイズ
ax.tick_params(axis='x', length=7, which='major', labelsize=15)
ax.tick_params(axis='y', length=7, which='major', labelsize=15)
ax.tick_params(axis='z', length=7, which='major', labelsize=15)
# 凡例
ax.legend(fontsize=15)
plt.show()
<output>
より詳しい説明を知りたい方は、『Pythonでグラフを作成する方法|matplotlibの基本をマスター』を参考にしてください。
3次元グラフの背景色を変更する
3次元グラフの背景色を変える場合は、以下のように軸ごとに変更を行います。
# 背景色を変更
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection' : '3d'})
ax.w_xaxis.set_pane_color((0., 0., 0., 0.))
ax.w_yaxis.set_pane_color((0., 0., 0., 0.))
ax.w_zaxis.set_pane_color((0., 0., 0., 0.))
参照 : mpl_toolkits.mplot3d.axis3d.Axis
<output>
引数は、最初の三つがRGBカラーで、最後が透明度です。
まとめ
お疲れ様です。ここまでを理解すれば、複雑な3次元グラフも簡単に作成することができます。
簡単に今回説明したことを復習しましょう。
- Pythonで3次元プロットを作成するための準備
- Pythonで3次元曲線をプロットする方法
- Pythonで3次元曲面をプロットする方法
- 3次元グラフを回転させる
さらに『seaborn』というライブラリを利用することでより簡単に高度なグラフを作成できるようになります。
詳しくは、下記で勉強してみてください。
より体系的な知識を身につけたい方はUdemyやプログラミングスクールをおすすめします。
Pythonを学習するのに効率的なサービスを紹介していきます。
まず最初におすすめするのは、Udemyです。
Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。
また、セール中は1500円定義で利用することができ、コスパも最強です。
下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。
他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。
自分の学習スタイルに合わせて最適なものを選びましょう。
また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。