web-dev-qa-db-ja.com

matplotlibを使用して、z関数を指定して3Dプロットを作成したい

Xおよびyパラメーターを受け入れてz出力を返すz関数があります。これを3Dでプロットし、スケールを設定したいと思います。どうすればこれを簡単に行うことができますか?私はドキュメントを調べるのにあまりにも多くの時間を費やしましたが、これを行う方法を一度も見たことがありません。

21
WhatsInAName

プロットスタイルはデータによって異なります。3D曲線(線)、サーフェス、または点の散布図をプロットしようとしていますか?

以下の最初の例では、ドメインのx-y平面に等間隔の点の単純なグリッドを使用しました。通常、最初にxsとysのドメインを作成し、次にそこからzsを計算します。

このコードは、次の操作を開始するための実用的な例を示しています。

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

def fun(x, y):
    return x + y

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n = 10
xs = [i for i in range(n) for _ in range(n)]
ys = list(range(n)) * n
zs = [fun(x, y) for x,y in Zip(xs,ys)]

ax.scatter(xs, ys, zs)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

scatter


サーフェスの場合は少し異なりますが、ドメインのグリッドを2D配列で渡します。滑らかな表面の例を次に示します。

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

def fun(x, y):
    return x**2 + y

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = y = np.arange(-3.0, 3.0, 0.05)
X, Y = np.meshgrid(x, y)
zs = np.array([fun(x,y) for x,y in Zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)

ax.plot_surface(X, Y, Z)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

surface

その他の多くの例については、ドキュメントの mplot3dチュートリアル を確認してください。

29
wim