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()
也许这个问题是重复的,因为我可以想象很多人都面临这个问题。如果是这样请见谅。
我想在 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()