3D 空間内の点のセットを表す 3 組のリストがあります。これらすべての点をカバーする表面をプロットしたいと思います。
plot_surface
パッケージ内の関数では、引数mplot3d
として X、Y、Z が 2 次元配列である必要があります。これはplot_surface
表面をプロットする適切な関数ですか? また、データを必要な形式に変換するにはどうすればよいですか?
data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)]
ベストアンサー1
サーフェスの場合は 3 タプルのリストとは少し異なり、ドメインのグリッドを 2D 配列で渡す必要があります。
何らかの関数ではなく、3D ポイントのリストだけを持っている場合f(x, y) -> z
、その 3D ポイント クラウドをサーフェスに三角測量する方法が複数あるため、問題が発生します。
滑らかな表面の例を次に示します。
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# Axes3D import has side effects, it enables using projection='3d' in add_subplot
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(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()