python 在matplotlib中绘制一条3D线和一个3D曲面:为什么线会出现在顶部?

8tntrjer  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(141)

嗨,我正在尝试绘制一个3D表面图和一个3D线在同一个图。线代表梯度下降的表面。该图看起来像这样:


的数据
我注意到线图看起来是在曲面图的上方分层的,即使曲面在这个Angular 应该部分隐藏线。
这是处理绘图的代码:

# Make figure and axes
fig = plt.figure(figsize =(8,6))
ax = plt.axes(projection ='3d')
# Plot the surface function we are minimising
ax.plot_surface(X,Y,Z,cmap = plt.get_cmap('Blues_r')) 
# Plot the line
ax.plot(x,y,z)
plt.show()

字符串
x,y,z是直线的坐标,X,Y,Z是曲面的坐标,在代码的不同部分中计算。
有没有一种方法可以使表面和线相互重叠,这取决于从任何给定的Angular 看哪一个最接近观察者?

jjhzyzn0

jjhzyzn01#

我相信这与matplotlib渲染3d图形的方式有关。该库主要是为了处理2D可视化,这反映在3D可视化的渲染方式中。3D对象(如您在示例中渲染的表面和线条)是根据对象的z顺序渲染的。基本上,3d对象是作为一个整体渲染的,并且部分重叠的对象将无法正确渲染。理论上,您应该能够通过将对象(例如3D线)切成更小的部分来规避此问题,如下所示:

# amount of samples the line has
n_samples = 100
# normal plotting of 3d line
ax.plot(x,y,z)

# splitted plotting
step = 1
for i in range(step, n_samples, step)
  ax.plot(x[i-1:i+step],y[i-1:i+step],z[i-1:step])

字符串
其中步骤决定了你要渲染的片段的大小。然而,我还没有设法让这个工作与我在自己的系统中复制的数据的近似值。Poly 3DCollections还有一个zsort参数,可以改变它来决定如何为对象确定z顺序。
结论是,我真的不能告诉你如何解决这个问题,但是这是matplotlib如何显示3D图形的一个基本问题。知道这一点可能会帮助你找到一个解决方案,尽管它可能有点“黑客”。祝你好运!

相关问题