python - matplotlib:在 3d 极坐标图中填充线下

标签 python matplotlib plot

我想在一个圆上绘制一个正弦波:也就是说,该圆位于 x,y 平面上,正弦波垂直于该平面(沿 z 轴向上)环绕它。我可以做到这一点,但是当我尝试用多边形填充圆和正弦波之间的区域(即在我的正弦波所在的假想圆柱体的表面上绘画)时,我无法完全正确 - matplotlib 似乎对绘图 View 中重叠的区域进行异或,而不是给我一个 View ,其中前面的区域遮挡了后面的区域。 这是我的代码的相关部分:

fig = plt.figure()
ax = fig.gca(projection='3d')
ax._axis3don = False
theta = np.linspace(0., 2 * np.pi, 1000)
r = 1.
x = r * np.sin(theta)
y = r * np.cos(theta)
sinez = N * np.sin(theta * m)
ax.plot(x, y, sinez, color='r')
xv = np.append(x, x[::-1])
yv = np.append(y, y[::-1])
zv = np.append(sinez, np.zeros(n))
verts = [zip(xv,yv,zrev),]
poly = Poly3DCollection(verts, facecolors = [cc('r'), cc('b')],
                        edgecolor='None')
poly.set_alpha(0.7)
ax.add_collection3d(poly)

它看起来像这样: enter image description here

最佳答案

matplotlib 存在的主要原因是 2D 绘图,3D 的东西只是一些巧妙的转换,可能会有 bug/hacky。固有的限制之一是 matplotlib 分层绘制,因此它没有“前面”或“后面”的概念,它只知道将曲线绘制到 Canvas 的顺序(其中被混淆地称为 z 顺序)。

如果您想让它看起来正确而不需要重新编写 3D 代码,请将正弦波分成几部分,并确保您手动设置了正确的 z 顺序(请参阅 How to draw intersecting planes? 以获取更简单的版本这个),但您将无法旋转图像。

如果您需要真正的 3D,我建议您查看 mayavi from enthought这是基于 OpenGL 的。

关于python - matplotlib:在 3d 极坐标图中填充线下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854587/

相关文章:

python - 如何在嵌套饼图中重新排列和设置颜色

plot - 在 R Markdown/knitr 中缩略图一些图的简单方法是什么?

python - 如何避免在 python 中动态分配的字符串中出现转义字符?

python - 在 Python 中递归遍历字典?

python - matplotlib scatter_hist 在直方图中具有 stepfilled histt​​ype

python - 如何用python中的散点图创建一个周边有均匀分布的点的圆

r - 如何使 gganimate 中的点出现而不是过渡

python - 如何从平面列表中制作嵌套列表?

python - Python 中的数据包嗅探 (Windows)

python - 绘制多个 seaborn 分布图