【问题标题】:Why are the arguments to Matplotlib's plot_wireframe two dimensional arrays?为什么 Matplotlib 的 plot_wireframe 二维数组的参数是?
【发布时间】:2023-03-22 08:10:01
【问题描述】:

我找不到 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)

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

【问题讨论】:

  • 轮廓here的类似问题。

标签: python matplotlib


【解决方案1】:

plot_wireframe(X,Y,Z) 中,X 是 x 坐标,Y 是 y 坐标,Z 是 z 坐标。那些需要是二维数组。原因是绘图功能需要一个 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]).
在 1D 情况下,(X[k+1], Y[k+1], Z[k+1]) 明显连接到 (X[k], Y[k], Z[k]),但这仅提供两个连接,而在线框中需要 4 个连接。

【讨论】:

  • 我做了更多的测试,并确信这是正确的。另一个答案也很有帮助。我想如果文档说明这一点会很好。
【解决方案2】:

让我用一些数字来解释一下。对于 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。

【讨论】:

  • 感谢您的回答。你会说每个维度代表什么?你能给它一个名字吗?即 X[i][j] 表示一个点的 x 值。你会怎么称呼 i 和 j?
  • @BobbyDurrett:i 和 j 默认代表 x 和 y 维度。对于矩阵,它只是行号和列号
  • 似乎 i 可能代表一条线,而 j 代表一条线内的一个点。
  • @BobbyDurrett:哦,是的,你完全正确。 i 指的是整行,可以将其视为垂直于 x 轴的一条线,即多个 y 值的单个 x 值
  • 我不会说 ij 指的是笛卡尔空间中的线;一旦你看,这个概念就会被打破,例如在sphere
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2017-04-28
  • 2018-04-06
相关资源
最近更新 更多