我试图弄清楚如何使用 pyplot 的输入数据
plot_surface
,因为它非常令人困惑。
首先,y 轴并不像我习惯的几何学那样代表高度。有一些文档,但对我来说没有意义。
的一般格式如下。ax.plot_surface()
>> ax.plot_surface(X, Y, Z)
其中 X 和 Y 是 x 和 y 点的二维数组,Z 是 高度。
我注意到在示例中数据通常构建如下:
import numpy as np
import matplotlib.pyplot as plt
tx = np.linspace(0, 1, nx)
ty = np.linspace(0, 1, ny)
X, Y = np.meshgrid(tx, ty)
Z = ((X**2-1)**2) # or some other pseudo-random generated data
plt.figure(figsize=(10,10))
plt.plot_surface(X, Y, Z)
plt.show()
所以据我所知,所有变量都是二维数组,其中:
所以不确定这些假设是否正确。
有谁知道在哪里以更容易理解的方式描述这些事情,或者有人可以为我解释/简化一下吗?
3 个数组 X、Y、Z 相互关联,结果图如下:
mesharray 命令旨在以直观的方式利用这一点:在每个数组中,在数组中“水平”移动对应于更改 x 坐标,同时保持 y 坐标不变。相反,在数组内“垂直”移动对应于更改 y 坐标,同时保持 x 坐标不变。
阵列内的移动与 3D 空间中的移动之间的这种对应关系纯粹是为了用户的方便和直觉而遵循的约定。
所有这一切的一个违反直觉的结果是,如果将相同的排列应用于所有 3 个数组,则表面保持相同。举一个简单的例子,如果你应用转置
X, Y, Z = X.T, Y.T, Z.T
那么生成的图形将是相同的,但数组中的水平移动现在对应于 y 坐标的变化,反之亦然。
另一个结果是,正如您所怀疑的,可以在非矩形区域上绘制曲面!这是一个快速演示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
nx = 11
ny = 11
tx = np.linspace(-1, 1, nx)
ty = np.linspace(-1, 1, ny)
X, Y = np.meshgrid(tx, ty)
Z = 1/(1 + X**2 + Y**2) # or some other pseudo-random generated data
#
# Reduce X,Y,Z to a diagonal strip
#
def diag_strip(M):
return np.vstack([np.diag(M,k=-1),np.diag(M)[:-1],np.diag(M,k=1)])
X = diag_strip(X)
Y = diag_strip(Y)
Z = diag_strip(Z)
fig, ax = plt.subplots(figsize = (10,10), subplot_kw={"projection": "3d"})
ax.plot_surface(X, Y, Z, cmap = cm.jet)
如果我们注释掉倒数第二个块(这会将 X,Y,Z 减少到对角线带上的坐标),那么我们最终会得到 [-1,1] x [-1,1] 上的预期图.
另一方面,按原样运行代码会产生以下结果:
减少后的X和Y数组如下:
[[-1. -0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8]
[-1. -0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8]
[-0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8 1. ]]
[[-0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8 1. ]
[-1. -0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8]
[-1. -0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8]]
每个数组的第一行对应于真实对角线“上方”的平行线,第二行对应于矩形网格的对角线,第三行对应于真实对角线“下方”的平行线。