嗨,我正在尝试绘制一个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 看哪一个最接近观察者?
1条答案
按热度按时间jjhzyzn01#
我相信这与matplotlib渲染3d图形的方式有关。该库主要是为了处理2D可视化,这反映在3D可视化的渲染方式中。3D对象(如您在示例中渲染的表面和线条)是根据对象的z顺序渲染的。基本上,3d对象是作为一个整体渲染的,并且部分重叠的对象将无法正确渲染。理论上,您应该能够通过将对象(例如3D线)切成更小的部分来规避此问题,如下所示:
字符串
其中步骤决定了你要渲染的片段的大小。然而,我还没有设法让这个工作与我在自己的系统中复制的数据的近似值。Poly 3DCollections还有一个
zsort
参数,可以改变它来决定如何为对象确定z顺序。结论是,我真的不能告诉你如何解决这个问题,但是这是matplotlib如何显示3D图形的一个基本问题。知道这一点可能会帮助你找到一个解决方案,尽管它可能有点“黑客”。祝你好运!