繁体   English   中英

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.

这篇文章解释了为什么plot_surface的输入是 2D 的。

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

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

如果您的点是以类似网格的方式创建的,最好同时创建网格,例如在这篇文章中。

似乎plot_trisurf为开放表面(如矩形桌布)而不是封闭表面创建了一个网格。

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

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

如果您需要更多的 3D 绘图能力, Mayawi 库会更合适。

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()

来自随机点的 3D 球体示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM