为什么Matplotlib的plot_wireframe的参数是二维数组?

时间:2019-03-21 20:51:48

标签: python matplotlib

我找不到对Matplotlib的plot_wireframe函数的X,Y和Z参数的清晰解释。我一直在使用他们提供的示例wire3d_demo.py,但是我不明白为什么X,Y和Z是二维数组。这是一张非常弯曲的3D图片,但是如果您查看X,Y和Z阵列,它们的大小均为120 x 120 2D阵列。 Matplotlib的文档具有以下简短描述:“数据值”。谁能详细说明一下?我喜欢Matplotlib,但其文档可能很少。

根据答案更新问题。也许2D阵列的第一维表示3D空间中的一条线,并且线框构造为连接所有线。在此示例中,我在x,y平面上绘制了两个四分之一圆,z坐标相距1.0:

temp_x = []
temp_y = []
temp_z1 = []
temp_z2 =[]

import math
# x^2+y^2=4
for i in range(201):
    x = 0.01 * i
    temp_x.append(x)
    y = math.sqrt(4-(x*x))
    temp_y.append(y)
    temp_z1.append(0.0)
    temp_z2.append(1.0)

X=np.array([temp_x,temp_x])
Y=np.array([temp_y,temp_y])
Z=np.array([temp_z1,temp_z2])

# Plot a basic wireframe.
ax.plot_wireframe(X, Y, Z)

two quarter circles connected by wire frame

我猜第一个维度是行号或函数号,第二个是点号。

2 个答案:

答案 0 :(得分:1)

让我解释一些数字。对于每个x值,都有一个y值范围。假设您在3-d曲面中总共有9个点。它们每个都有一个x值,一个y值和一个对应的z值。假设x = 1、2、3和y = 1、2、3。

现在,对于每个x值,都有3个y点,因为您拥有某种网格物体

x = 1 --> y = 1, 2, 3     
x = 2 --> y = 1, 2, 3
x = 3 --> y = 1, 2, 3

类似地,对于每个y值,都有3个x点。

y = 1 --> x = 1, 2, 3
y = 2 --> x = 1, 2, 3
y = 3 --> x = 1, 2, 3

所以x和y以及9的总组合

(x, y) --> (1, 1), (1, 2), (1, 3), 
           (2, 1), (2, 2), (2, 3), 
           (3, 1), (3, 2), (3, 3) 

因此x值的形状现在变为(3x3),因为您总共有9个值。同样,y值的形状变为(3x3)。现在,对于每个(x,y)对,您在3d空间中都有一个对应的z值。因此,您的z值也必须是3x3数组。

相同的概念和解释适用于任意数量的点,在您的问题中,该数字为120x120。

答案 1 :(得分:1)

plot_wireframe(X,Y,Z)中,X是x坐标,Y是y坐标,Z是z坐标。这些必须是2D阵列。原因是绘图功能需要2D网格。因此,(X[i,j], Y[i,j], Z[i,j])定义了笛卡尔空间中的一个点。 i,j是网格索引。

现在的问题可能是,为什么我们需要i,j作为网格索引,而不能仅使用索引为k的单个一维网格,因此X,Y,Z将是一维数组?
也就是说,因为在(X[k], Y[k], Z[k])的情况下,有关哪个点的信息位于哪个其他点的旁边而丢失了。在2D网格中,您可以明确确定(X[i,j], Y[i,j], Z[i,j])已连接到(X[i+1,j], Y[i+1,j], Z[i+1,j])(及其附近),例如(X[i,j-1], Y[i,j-1], Z[i,j-1])
在一维情况下,(X[k+1], Y[k+1], Z[k+1])显然已连接到(X[k], Y[k], Z[k]),但这仅给您两个连接,而线框中则需要4个连接。