Matplotlib

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

【matplotlib】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の基本を学ぶ(理解している方は飛ばして読んでください)

 

 

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

 

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

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

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

 

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

また、グラフの具体例を作成するために『numpy』もインポートしています。

『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’}』を設定してください。

 

# ウインドウとグラフを同時に作成
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>

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]
 [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の引数について説明していきます。

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次元グラフのカスタマイズ方法

 

ここからは、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>

3次元グラフカスタマイズ具体例3次元グラフのカスタマイズ例(2次元プロットと共通部分)

 

より詳しい説明を知りたい方は、『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次元グラフも簡単に作成することができます。

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

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

 

さらに『seaborn』というライブラリを利用することでより簡単に高度なグラフを作成できるようになります。

詳しくは、下記で勉強してみてください。

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

 

より体系的な知識を身につけたい方はUdemyやプログラミングスクールをおすすめします。

 

ABOUT ME
努力のガリレオ
【運営者】 : 東大で理論物理を研究中(経歴)東京大学, TOEIC950点, NASA留学, カナダ滞在経験有り, 最優秀塾講師賞, オンライン英会話講師試験合格, ブログと独自コンテンツで収益6桁達成 【編集者】: イングリッシュアドバイザーとして勤務中(経歴)中学校教諭一種免許取得[英語],カナダ留学経験あり, TOEIC650点
Python学習を効率化させるサービス

 

Pythonを学習するのに効率的なサービスを紹介していきます。

まず最初におすすめするのは、Udemyです。

Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。

また、セール中は1500円定義で利用することができ、コスパも最強です。

下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。

 

【最新】UdemyでおすすめのPythonコース|東大生が厳選!10万を超える講座があるUdemyの中で、Pythonに関係する講座を厳選しました。また、本記事では、Udemyを使用しながらPythonをどのような順番で勉強するべきかを紹介しました。ぜひ参考にしてください。...

 

他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。

 

【最新】Pythonに強いプログラミングスクール7選|東大生が厳選Pythonの流行と共に、Pythonに強いプログラミングスクールが増えてきました。本記事では、特にPythonを効率的に学ぶことができるプログラミングスクールを経験をもとに厳選して、内容を詳しく解説しています。...

 

自分の学習スタイルに合わせて最適なものを選びましょう。