【问题标题】:matplotlib: filling under line in 3d polar plotmatplotlib:在 3d 极坐标图中填充线下
【发布时间】:2013-06-01 01:56:26
【问题描述】:

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

它是这样的:

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      docs 中,开发人员声称Poly3DCollection

      对 _facecolors 和 _edgecolors 属性有一点魔力。

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

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

      【讨论】:

      • 啊,不朽的 matplotlib 文档。我想知道这涉及到什么样的“魔法”。不确定我是否能胜任编辑 matplotlib 源代码的工作,但我注意到 XOR 效应仅发生在我的圆圈同一侧的循环中,所以也许我应该改变定义多边形的方向。跨度>
      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 2011-09-26
      • 2013-06-14
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多