Matplotlib

【入門】Pythonで3次元(3D)グラフを作成(回転させるよ)

【入門】Pythonで3次元(3D)グラフを作成(回転させるよ)

 

Pythonで3次元グラフを作成するにはどうすれば良い?

本記事ではその悩みを解決していきます。

Pythonを使用することで、簡単に3次元のグラフを図示することができます。

本記事では、10〜15分程度でPythonのmatplotlibというライブラリを使用し、初心者でも高度な3次元グラフを作成できる方法を説明していきます。

 

本記事を読むメリット

  1. Pythonを利用して、さまざまな3次元プロットを作成できるようになる
  2. 3次元プロットのカスタマイズができるようになる
  3. Pythonで作成した3次元プロットを回転させ様々な角度から描画できるようになる

 

 

Pythonで3次元プロット作成するための準備

 

本章では、Pythonで3次元プロット作成する準備を行っていきます。

具体的には、以下の流れで行っていきます。

  1. 使用するパッケージをインポート
  2. matplotlibの基本を学ぶ(理解している方は飛ばして読んでください)

では、具体的に説明していきます。

 

使用するパッケージをインポート

 

まずは、使用するパッケージをインポートしていきます。

下記のコードを入力してください

<input>

# 使用するパッケージをインポート
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

 

今回は、3次元グラフを作成するために『mpl_toolkits.mplot3dからAxes3D』をインポートしました(最近は書かなくても大丈夫になっている場合も多いです。)

『numpy』の基本が心配という方は、下記の記事を参考にしてください。

 

numpyの使い方【15分で使えるようになる】機械学習やデータ解析をいち早く行うために、numpyに関する基本事項を体系的にまとめました。15分程度で読めるので、この記事でnumpyの基本を習得し、次のステップに進みましょう。...

 

matplotlibの基本を学ぶ

 

3次元グラフ作成では、matplotlibのカスタマイズ方法をそのまま利用することができます。

そのため、matplotlibのカスタマイズ方法を知っておく必要があります。

matplotlibの基本操作が心配な方は下記を参考にしてください(15分程度で高度なグラフが作成できるようになります)

 

【15分】Pythonでグラフを作成する方法(matplotlib)Pythonでグラフを書くことが難しそうだと思っていませんか?実は、Pythonを使用したグラフ作成は、excelより便利で簡単です。この記事では、初心者でもグラフが書けるように丁寧にpythonのグラフの作成法を説明します。...

 

Pythonで3次元曲線をプロットする方法

 

本章では、Pythonで3次元プロットを作成する方法を具体的な例を使用して説明していきます。

具体的には、下記のステップで説明していきます。

  1. ウインドウと3次元グラフを作成
  2. 3次元曲線をプロットする方法

詳しく説明していきます。

 

ウインドウと3次元グラフを作成

 

本節では、3次元曲面をプロットするためのウインドウ(figureオブジェクト)と3次元グラフ(axオブジェクト)を作成する二つの方法を説明します。

ウインドウと3次元グラフを作成する方法は以下の二つです。

  1. ウインドウとグラフを別々に作成
  2. ウインドウとグラフを同時に作成

詳しく説明していきます。

 

ウインドウとグラフを別々に作成

 

ウインドウとグラフを別々に作成する方法には以下のコードを入力してください。

<Input>

# ウインドウとグラフを別々に作成
fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, projection='3d')

 

<output>

 

ウインドウとグラフを同時に作成

 

ウインドウとグラフを同時に作成する場合は、『plt.subplots関数』の引数に『subplot_kw={‘projection’ : ‘3d’}』を設定してください。

<input>

# ウインドウとグラフを同時に作成
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メソッド』を使用し、プロットすることができます。

<input>

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>

3次元曲面をプロット

 

コードを見ていただくとわかると思いますが、プロットラインの色変更や軸メモリの設定はmatplotlibのカスタマイズと全く同じです。

次章では、3次元曲面を作成する方法を説明していきます。

 

Pythonで3次元曲面をプロットする方法

 

本章では、3次元曲面をプロットする方法を説明していきます。

具体的には、下記の流れで説明していきます。

  1. メッシュ(格子点)を作成
  2. 3次元曲面をプロット : plot_surface
  3. カラーバーを設定する方法
  4. ワイヤーを利用し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関数を利用し下記のようなメッシュ(格子点)を作成することができました。

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]
 
 
 ]

 

次節では、具体的に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の引数について説明していきます。

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>

wireを利用してプロット

 

『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>

3次元散布図

 

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>

3次元グラフを回転

 

『view_init』の引数について解説していきます。

view_init  
elev 縦方向の回転
azim 横方向の回転

 

もう少し引数について詳しく説明すると、下記のような状態を0度として、縦方向・横方向に何度回転させるかというのが『elev, azim』です。

角度0の状態回転角度0度のグラフ

 

まとめ

 

お疲れ様です。ここまでを理解すれば、複雑な3次元グラフも簡単に作成することができます。

簡単に今回説明したことを復習しましょう。

  1. Pythonで3次元プロットを作成するための準備
  2. Pythonで3次元曲線をプロットする方法
  3. Pythonで3次元曲面をプロットする方法
  4. 3次元グラフを回転させる

 

さらに高度なグラフをmatplotlibを拡張させた『seaborn』というライブラリを使用して作成することができます。

seabornについて学びたい方は下記を参考にしてください。

 

【15分で習得】seabornの使い方を徹底解説seabornを使用することで、簡単に高度なグラフを描画することができます。また、使用方法もmatplotlibと変わらず簡単に行うことができます。...

 

『Pythonの独学が厳しい…』と感じている方は、一度下記で紹介しているプログラミングスクールを検討してみてください。

 

【最新】Pythonに強いプログラミングスクール7選(東大生のオススメ)Pythonの流行と共にPythonに強いプログラミングスクールが増えてきました。この記事では、プログラミング経験豊富な私が本当にオススメできるPythonに強いプログラミングスクールを7つ紹介しました。...
ABOUT ME
努力のガリレオ
【運営者】 : 東大で理論物理を研究中(経歴)東京大学, TOEIC950点, NASA留学, カナダ滞在経験有り, 最優秀塾講師賞, オンライン英会話講師試験合格, ブログと独自コンテンツで収益6桁達成 【編集者】: イングリッシュアドバイザーとして勤務中(経歴)中学校教諭一種免許取得[英語],カナダ留学経験あり, TOEIC650点