matplotlib ライブラリ

【python】matplotlibで3次元(3D)のグラフを作成する方法

pythonの描画ライブラリである「matplotlib」を用いて、3次元のグラフを作成する方法を紹介します。

本記事では、以下の内容を紹介します。

この記事で分かること

  • 3dグラフを作成する方法
  • 3dの散布図を作成する方法
  • 3dの折れ線グラフを作成する方法
  • 3dのグラフを回転させる方法
  • 3dのグラフをアニメーション化する方法
  • 3次元曲面を描画する方法

スポンサーリンク

matplotlibで3dグラフを作成する方法

はじめに、matplotlibで3次元のグラフを作成する方法を紹介します。

matplotlibで3次元のグラフを作成するためには、
fig.add_subplot( ) の引数として、projection='3d' を指定します。

あとは、通常の2次元グラフを作成方法の延長で、3次元グラフを作成できます。

以下、3次元の散布図を作成するサンプルコードです。

### 3dグラフを作成
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

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

ax.scatter(x, y, z, color='blue')

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> ax = fig.add_subplot(projection='3d')

axisオブジェクトを作成しています。
fig.add_subplot( ) の引数として、 projection='3d' を指定しています。

axisオブジェクトと聞いてピンとこなかった方は、下記の記事についても参考にしてみてください。
matplotlibの2つのグラフ描画方法の違いについて解説しています。

matplotlibのpyplot(plt)とaxの違い

3dグラフに、ラベルやタイトルを表示する方法

参考までに、3次元グラフにラベルやタイトルを表示する方法を紹介します。

以下、サンプルコードです。

### 3dグラフを作成
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

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

ax.scatter(x, y, z, color='blue', label='label')

ax.set_title('title')

ax.set_xlabel('X-label')
ax.set_ylabel('Y-label')
ax.set_zlabel('Z-label')

ax.legend()

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> ax.set_title('title')

タイトルを表示しています。
タイトルの表示方法の詳細については、下記の記事で紹介しています。

matplotlibのグラフにタイトルを表示する方法【位置、フォント】

> ax.set_xlabel('X-label')
> ax.set_ylabel('Y-label')
> ax.set_zlabel('Z-label')

軸ラベルを表示しています。
Z軸も、X軸Y軸と同様の方法で表示できます。
軸まわりの設定については、下記の記事で紹介しています。

matplotlibのグラフの軸関連の設定まとめ【ラベル、範囲、目盛】

> ax.legend( )

凡例を表示しています。
凡例の設定方法については、下記の記事で紹介しています。

matplotlibのグラフに凡例を表示する方法【位置、フォント】

matplotlibで3dの散布図を作成する方法

matplotlibで、散布図の3次元グラフを作成する方法を紹介します。

matplotlibの、散布図を作成するメソッドである matplotlib.pyplot.scatter に3軸分をデータを指定することで、散布図の3次元グラフを作成できます。

以下、3dの散布図を作成するサンプルコードです。前述のコードを再掲しています。

### 3dの散布図を作成する方法
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

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

ax.scatter(x, y, z, color='blue')

plt.show()

コードを実行すると、こちらのグラフが表示されます。(前述のグラフを再掲しています)

実行結果

> ax.scatter(x, y, z, color='blue')

散布図を描画しています。

散布図の描画方法については、下記の記事で紹介しています。

matplotlibで散布図を作成する方法

3dの散布図のマーカーのサイズの変更方法

参考までに、3次元の散布図のマーカーサイズを変更する方法を紹介します。

以下、サンプルコードです。

### 3dの散布図のマーカーサイズを変更する方法
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)

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

ax.scatter(x, y, z, s=100, color='blue')

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> ax.scatter(x, y, z, s=100, color='blue')

引数として、s= を指定することで、散布図のマーカーサイズを変更できます。

スポンサーリンク

matplotlibで3dの折れ線グラフを作成する方法

matplotlibで、3次元の折れ線グラフを作成する方法を紹介します。

matplotlibの、折れ線グラフを作成するメソッドである matplotlib.pyplot.plot に3軸分をデータを指定することで、散布図の3次元グラフを作成できます。

以下、3次元の折れ線グラフを作成するサンプルコードです。

### 3dの折れ線グラフを作成する方法
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,1,10)
y = np.linspace(0,1,10)
z = np.linspace(0,1,10)

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

ax.plot(x, y, z, marker='*', markersize=15, color='blue')

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> ax.plot(x, y, z, marker='*', markersize=15, color='blue')

折れ線グラフを描画しています。
引数 marker= を指定することで、マーカーの形状を変更できます。
引数 markersize= を指定することで、マーカーサイズを変更できます。

折れ線グラフの作成方法については、下記の記事で紹介しています。

matplotlibで折れ線グラフを作成する方法【エラーバーなど】

matplotlibで3dグラフを回転させる方法

matplotlibで作成した3次元のグラフを回転させる方法について、紹介します。

なお、ここで紹介する方法は jupyter notebook でのみ使用できます。

コードに、%matplotlib notebook を記述することで、matplotlibのグラフをインタラクティブモードで出力することができます。

インタラクティブモードでグラフを出力すると、グラフを回転させたり拡大縮小表示できるようになります。

### matplotlibで3次元グラフを回転
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0, np.pi * 4, 50)
x = np.cos(t)
y = np.sin(t)
z = np.linspace(0,1,50)

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

plt.cla()
ax.plot(x, y, z, marker='o', markersize=5, color='blue')

plt.show()

コードを実行すると、グラフがインタラクティブモードで表示されます。

実行結果
実行結果

インタラクティブモードでは、マウス操作でグラフを回転させたり、縮小拡大できます。

また、画像として保存することもできます。

スポンサーリンク

matplotlibで3dグラフをアニメーション化する方法

matplotlibで、3次元グラフをアニメーション化する方法について紹介します。

matplotlibでアニメーションを作成する方法として、ArtistAnimationを用いる方法と、FuncAnimationを用いる方法の2通りの方法があります。

ArtistAnimationは、アニメーション化するグラフをあらかじめリストの形で用意しておき、それを順番に表示します。

FuncAnimationは、あらかじめグラフを用意するのではなく、アニメーションの1フレームごとに関数を実行し、関数の実行結果を順番に表示します。

とっつきやすいのはArtistAnimationの方ですが、あらかじめアニメーション化するグラフを作成しリストとして保持しないといけないため、重くなるという欠点があります。

以下、ArtistAnimationを用いて3次元のグラフのアニメーションを表示するサンプルコードです。

### matplotlib上でアニメーションを表示
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import ArtistAnimation

t = np.linspace(0, np.pi * 4, 50)
z = np.linspace(0,1,50)

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

frames = []
for i in np.linspace(0, np.pi*2, 50):
    x = np.cos(t + i)
    y = np.sin(t + i)
    frame = ax.plot(x, y, z, marker='o', markersize=5, color='blue')
    frames.append(frame)

ani = ArtistAnimation(fig, frames, interval=100)
 
plt.show()

コードを実行すると、こちらのアニメーションが表示されます。

実行結果

> %matplotlib notebook

筆者環境は jupyter notebook であるため、この一行を記述しています。
これを記述することで、matplotlibのグラフをインタラクティブモードで出力することができます。
とりあえず、jupyter notebookでアニメーションを表示する際に必要と覚えておいてください。

> t = np.linspace(0, np.pi * 4, 50)

0から4πまでの、2周期分の t の要素を作成しています。

> for i in np.linspace(0, np.pi*2, 50):

0から2πまでの要素を50個作成し、順番に i に渡してループさせます。

> x = np.cos(t + i)
> y = np.sin(t + i)
> frame = ax.plot(x, y, z, marker='o', markersize=5, color='blue')
> frames.append(frame)

x、yの値を更新しつつグラフを作成し、リストに追加しています。

> ani = ArtistAnimation(fig, frames, interval=100)

ArtistAnimationで、アニメーションを作成しています。
intervalの単位はミリ秒です。

matplotlibでグラフをアニメーション化する方法については、下記の記事で紹介しています。

matplotlibでグラフのアニメーションを作成する方法

matplotlibで作成したグラフを画像として出力し、gifファイルを作成する方法については、下記の記事で紹介しています。

matplotlibのグラフからgifを作成する方法

matplotlibで3次元曲面を描画する方法

matplotlibを用いて、3次元曲面を描画する方法を紹介します。

3次元曲面を描画するためには、メッシュを作成する必要があります。
メッシュは、numpy の meshgrid( ) を用いることで生成できます。

以降では、meshgrid( ) で生成したメッシュを用いて、3次元曲面を描画するサンプルコードを紹介します。

面として3次元曲面を描画する方法、ワイヤを用いて3次元曲面を描画する方法、散布図を用いて3次元曲面を描画する方法の3つのパターンを紹介します。

3次元曲面を描画

はじめに、面として3次元曲面を描画する方法を紹介します。

plot_surface( )を用いることで、3次元曲面を面で描画することができます。

以下、サンプルコードです。

### 3次元曲面を描画
import matplotlib.pyplot as plt
import numpy as np

def func(x, y):
    return np.sin(x) * np.sin(y)

x = np.linspace(0, np.pi * 4, 40)
y = np.linspace(0, np.pi * 4, 40)
X, Y = np.meshgrid(x, y)


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

ax.plot_surface(X, Y, func(X,Y), alpha=0.7)

ax.set_title('title')

ax.set_xlabel('X-label')
ax.set_ylabel('Y-label')
ax.set_zlabel('Z-label')

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> x = np.linspace(0, np.pi * 4, 40)
> y = np.linspace(0, np.pi * 4, 40)
> X, Y = np.meshgrid(x, y)

3次元曲面を描画するために必要なメッシュを生成しています。

> ax.plot_surface(X, Y, func(X,Y), alpha=0.7)

plot_surface( )で、3次元曲面を描画しています。

ワイヤを用いて3次元曲面を描画

ワイヤを用いて3次元曲面を描画する方法を紹介します。

plot_wireframe( )を用いることで、3次元曲面をワイヤで描画することができます。

以下、サンプルコードです。

### ワイヤを用いて3次元曲面を描画
import matplotlib.pyplot as plt
import numpy as np

def func(x, y):
    return np.sin(x) * np.sin(y)

x = np.linspace(0, np.pi * 4, 40)
y = np.linspace(0, np.pi * 4, 40)
X, Y = np.meshgrid(x, y)


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

ax.plot_wireframe(X, Y, func(X,Y), alpha=0.5)

ax.set_title('title')

ax.set_xlabel('X-label')
ax.set_ylabel('Y-label')
ax.set_zlabel('Z-label')

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> ax.plot_wireframe(X, Y, func(X,Y), alpha=0.5)

plot_wireframe( )を用いることで、ワイヤで3次元曲面を描画しています。

散布図を用いて3次元曲面を描画

散布図で3次元曲面を描画する方法を紹介します。

scatter3D( )を用いることで、3次元曲面を散布図で描画することができます。

以下、サンプルコードです。

### 散布図を用いて3次元曲面を描画
import matplotlib.pyplot as plt
import numpy as np

def func(x, y):
    return np.sin(x) * np.sin(y)

x = np.linspace(0, np.pi * 4, 100)
y = np.linspace(0, np.pi * 4, 100)
X, Y = np.meshgrid(x, y)


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

ax.scatter3D(X, Y, func(X,Y), s=1.0, alpha=0.5)

ax.set_title('title')

ax.set_xlabel('X-label')
ax.set_ylabel('Y-label')
ax.set_zlabel('Z-label')

plt.show()

コードを実行すると、こちらのグラフが表示されます。

実行結果

> ax.scatter3D(X, Y, func(X,Y), s=1.0, alpha=0.5)

scatter3D( )を用いることで、3次元曲面を散布図で描画しています。

スポンサーリンク

-matplotlib, ライブラリ
-,