matplotlib:在3d极坐标图下填充

时间:2013-05-31 09:54:53

标签: python matplotlib plot

我想在圆上绘制一个正弦波:也就是说,圆是在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)

这是它的样子: enter image description here

2 个答案:

答案 0 :(得分:2)

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

如果您希望在不重写3D代码的情况下使其正确,请将正弦波分成几部分,并确保手动设置z顺序(有关更简单的信息,请参阅How to draw intersecting planes?此版本),但您将无法旋转图像。

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

答案 1 :(得分:1)

docs中,开发者声称Poly3DCollection

  

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

我认为这是你可以在这里看到的XOR效果,看着code它似乎正在发挥魔力的功能do_3d_projection

正如我所看到的那样,你可以继承Poly3DCollection并重写do_3d_projection以获得你想要的东西,或者想到另一种方式来绘制这个(也许将正弦曲线和圆圈视为单独的对象) )。