Matplotlib plot_surface:如何将一维数组转换为所需的二维输入?

Matplotlib plot_surface: How to convert 1D arrays to required 2D input?

也许这个问题是重复的,因为我可以想象很多人都面临这个问题。如果是这样请见谅。

我想在 Matplotlib 3D 中绘制一个球体。为此,我有一堆 xyz 坐标。当我用 plot_trisurf 绘制它时,我得到这个:

所以我想尝试 plot_surface,但是我得到了错误 ValueError: Argument Z must be 2-dimensional.

This post 解释了为什么 plot_surface 的输入是二维的。

我的问题是:如何将我的常规 xyz 坐标转换为 plot_surface 需要的格式?

编辑: 好的,我知道 3 元组可以有不同的解释。有没有一种方法可以将 plot_trisurf 与某种极坐标一起使用,这样它就不会“通过 xy 平面”进行插值,而是从坐标原点进行球面插值?

如果你的点是用mesh-like方式创建的,最好同时创建网格,比如这个post.

似乎 plot_trisurf 为开放表面(如矩形 table 布料)创建网格,但不是为封闭表面创建网格。

如果点没有很好地组织,但您知道所有点都位于凸 3D 表面(例如球体)上,您可以计算 3D 凸包并绘制它。

下面的代码就是这样做的。请注意,有些三角形看起来更暗,有些更亮。这是因为 ConvexHull 返回的三角形方向不正确(例如,顺时针方向表示多边形的外表面)。为此,您需要为每个三角形 并反转三角形,以防该法线与三角形中心的点积为负(假设 0,0,0 位于球体内)。

如果您需要更强大的 3D 绘图功能,Mayawi library 会更合适。

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

xyz = np.random.randn(3, 50) # random 3D points
xyz /= np.linalg.norm(xyz, axis=0) # project each point on a unit sphere

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

hull = ConvexHull(xyz.T)
ax.plot_trisurf(*xyz, triangles=hull.simplices, linewidth=0.2, antialiased=True)
plt.show()