3D绘图:为什么坐标参数作为2D数组输入?

时间:2013-07-08 16:58:30

标签: python matplotlib mplot3d

mplot3d函数plot_surface要求将定义曲面的点的坐标输入为三个2D数组X,Y,Z。这是一个演示这些数组结构的工作示例。我用球面坐标表示由角度u和v参数化的x,y,z坐标。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')

# generate the coordinates on the surface by parameterizing 
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, 2 * np.pi, 100)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))

ax.plot_surface(x, y, z) 
plt.show()

我相信由X,Y,Z表示的坐标恰好是在i和j上索引的所有三元组[X[i,j], Y[i,j], Z[i,j]]的集合。 (1)这是对的吗?

我为构建真实情节而编写的许多函数都采用了一个三元组列表的参数,正好是上面三元组的形式;即points = [[x1,y1,z1], [x2,y2,z2], ..., [xn, yn, zn]]。我预计plot_surface会接受此输入,但事实并非如此。结果我发现自己需要相当频繁地在两个表示之间进行转换,例如:通过

points = zip(*[x.flatten() for x in (X,Y,Z)])

我可以这样做,但我担心我应该将2D数组格式用于我自己的功能。 (2)除了编程这些数组的构造之外,数组输入格式是否有原因?例如,计算效率更高吗?

1 个答案:

答案 0 :(得分:2)

表面图可能绘制为三角形网格。通过2D数组点可以清楚地表明每个三角形中应包含哪些点(可能是[i][j]-[i+1][j]-[i][j+1][i][j+1]-[i+1][j]-[i+1][j+1])。