【Python/matplotlib】3Dグラフの視点を変える方法

Programming
この記事は約5分で読めます。

こんにちは、JS2IIUです。
matplotlibでの基本的な三次元グラフの描画方法と視点の変更方法についてメモします。plt.show()で表示したときはマウスで視点を自由に変更できますが、plt.savefig()の時には視点がデフォルトの位置となってしまい、都合が悪いことがあります。

重要なところだけ最初に書いておきます。詳しいことは本家のReferenceを参照してください。

ax.view_init(elev=30, azim=60)

1. 三次元グラフの基本

まず、三次元グラフを作成するための基本的な手順を説明します。

ステップ1: 必要なライブラリのインポート

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

ステップ2: データの準備

# データを生成
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

ステップ3: 三次元プロットの作成

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()

上記のコードは、基本的な三次元グラフを描画します。ここでは、plot_surfaceメソッドを使用して三次元の曲面をプロットしています。

2. 視点の変更

三次元グラフでは、視点を変更することで異なる角度からデータを観察することができます。視点を変更するには、view_initメソッドを使用します。

ax.view_init(elev=30, azim=60)

elevは仰角(z軸に対する角度)、azimは方位角(x-y平面に対する角度)を指定します。

ax.view_init()でvertical_axisオプションをデフォルトのまま変えなければ、視点方向とelev, azimの関係は下の図の通りとなります。

3. サンプルコード: 各平面からの視点

次に、三次元グラフをxy平面、yz平面、zx平面の方向から表示し、一つのFigureに並べるサンプルコードを示します。

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

# データを生成
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# FigureとAxesの準備
fig = plt.figure(figsize=(18, 6))

# xy平面からの視点
ax1 = fig.add_subplot(131, projection='3d')
ax1.plot_surface(X, Y, Z, cmap='viridis')
ax1.set_title('View from xy-plane')
ax1.view_init(elev=90, azim=-90)

# yz平面からの視点
ax2 = fig.add_subplot(132, projection='3d')
ax2.plot_surface(X, Y, Z, cmap='viridis')
ax2.set_title('View from yz-plane')
ax2.view_init(elev=0, azim=0)

# zx平面からの視点
ax3 = fig.add_subplot(133, projection='3d')
ax3.plot_surface(X, Y, Z, cmap='viridis')
ax3.set_title('View from zx-plane')
ax3.view_init(elev=0, azim=90)

plt.show()

このサンプルコードでは、fig.add_subplotを使用して一つのFigureに三つの三次元グラフを並べています。それぞれのグラフは異なる視点から表示されており、view_initメソッドで視点を設定しています。これにより、xy平面、yz平面、zx平面の方向からデータを見ることができます。

vartical_axisをデフォルトのままにしたとき、以下の表の通り指定すれば期待通りの結果が得られると思います。

視点平面elevazim
XY90-90
XZ0-90
YZ00
-XY-9090
-XZ090
-YZ0180

最後まで読んでいただき有難うございました。73

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました