2

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

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)

这是它的样子: 在此处输入图像描述

4

2 回答 2

2

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

如果您想在不重新编写 3D 代码的情况下使其看起来正确,请将正弦波分成几部分,并确保您手动设置 z 顺序(请参阅如何绘制相交平面?以获得更简单的版本这),但您将无法旋转图像。

如果您需要真正的 3D,我建议您从基于 OpenGL 的mayavi enthought中进行研究。

于 2013-05-31T17:56:26.257 回答
1

文档中,开发人员声称Poly3DCollection

使用 _facecolors 和 _edgecolors 属性做了一些魔术。

我相信这是您可以在此处看到的 XOR 效果,并且查看代码do_3d_projection,它似乎是在发挥作用的函数。

正如我所看到的,您可以子类化Poly3DCollection并重写do_3d_projection以获得您想要的东西,或者考虑另一种方式来绘制它(也许以某种方式将正弦曲线和圆视为单独的对象)。

于 2013-05-31T10:17:49.933 回答