3D Surface Plot其中z是采用由x和y形成的向量的函数

时间:2017-11-29 13:26:26

标签: python matplotlib vector 3d

我正在尝试生成一个三维曲面图,其中X和Y的值介于-50和50之间,而Z则是根据X和Y的函数计算的。

此函数将矢量作为np数组形式的参数。向量的第一行是来自X的值,第二行是来自Y的值.X和Y的所有组合应该产生Z值,因此是网格。

这是我的实现,对于Z我正在创建一个向量,其中第一行是X的整个数据集,第二行是Y的整个数据集。这当然是不正确的。

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
import matplotlib.pyplot as plt

def myFunction(v):
    return v.dot(np.array([1, 2]))

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

# Make data.
X = np.linspace(-50,50, 100)
Y = np.linspace(-50,50, 100)
X, Y = np.meshgrid(X, Y)
Z = myFunction(np.array([X, Y])) # <-- Here is the problem

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.Greens,
                       linewidth=0, antialiased=False)


ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

我希望我有道理, 感谢

1 个答案:

答案 0 :(得分:0)

您可能希望提供一个数组,其中包含第一列中的所有x值以及第二列中函数的所有y值。这将确保尺寸与点积相匹配。然后可以将结果重新整形为网格的形状。

Z = myFunction(np.array([X.flatten(), Y.flatten()]).T).reshape(X.shape)

完整示例:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
import matplotlib.pyplot as plt

def myFunction(v):
    return v.dot(np.array([1, 2]))

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

# Make data.
X = np.linspace(-50,50, 100)
Y = np.linspace(-50,50, 100)
X, Y = np.meshgrid(X, Y)
Z = myFunction(np.array([X.flatten(), Y.flatten()]).T).reshape(X.shape)

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.Greens,
                       linewidth=0, antialiased=False)


ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

enter image description here