如何绘制相交的平面?

时间:2013-02-12 03:26:04

标签: python matplotlib

我想使用matplotlib或多或少地绘制下面附着的图形,其中包括两个相交的平面,其中正确的透明度指示它们的相对方向,以及两个平面中的圆和矢量以2D投影。

我不确定是否存在执行此操作的现有包,任何提示?image credit: M Strassler

2 个答案:

答案 0 :(得分:20)

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

dim = 10

X, Y = np.meshgrid([-dim, dim], [-dim, dim])
Z = np.zeros((2, 2))

angle = .5
X2, Y2 = np.meshgrid([-dim, dim], [0, dim])
Z2 = Y2 * angle
X3, Y3 = np.meshgrid([-dim, dim], [-dim, 0])
Z3 = Y3 * angle

r = 7
M = 1000
th = np.linspace(0, 2 * np.pi, M)

x, y, z = r * np.cos(th),  r * np.sin(th), angle * r * np.sin(th)

ax.plot_surface(X2, Y3, Z3, color='blue', alpha=.5, linewidth=0, zorder=-1)

ax.plot(x[y < 0], y[y < 0], z[y < 0], lw=5, linestyle='--', color='green',
        zorder=0)

ax.plot_surface(X, Y, Z, color='red', alpha=.5, linewidth=0, zorder=1)

ax.plot(r * np.sin(th), r * np.cos(th), np.zeros(M), lw=5, linestyle='--',
        color='k', zorder=2)

ax.plot_surface(X2, Y2, Z2, color='blue', alpha=.5, linewidth=0, zorder=3)

ax.plot(x[y > 0], y[y > 0], z[y > 0], lw=5, linestyle='--', color='green',
        zorder=4)

plt.axis('off')
plt.show()

result

注意事项:

  • 我正在运行一个非常接近当前主人的版本,所以我不是 确定哪些版本适用于旧版本

  • 分割绘图的原因是“上方”和“下方”是以某种神秘的方式确定的(我并不完全确定zorder实际上做了什么),而且确实是取决于艺术家绘制的顺序。因此,表面不能相交(每个地方都会相交),因此您需要分别绘制交叉点两侧的部分。 (你可以在黑色线条中看到这一点,我在上面的蓝色平面顶部看起来没有分开。)

  • 表面的“正确”排序似乎也取决于视角。

答案 1 :(得分:5)

Matplotlib确实具有3d投影功能,但虚线在最终的2D图像视图中以恒定宽度绘制,看起来并不像在倾斜平面上平放。如果几何图形很简单,并且“轨道”圆形,它可能会起作用,但是如果你想要绘制一个角度看到的椭圆,观众可能希望在整个3D布局上有更多的视觉线索。

如果我不得不制作一个漂亮的花哨插图,但更好,更漂亮,而且不必自动化,我首先要创建图形 - 至少是虚线圆圈 - 每个这些平面是一个简单的平面2D图像,使用目前看起来很方便的东西 - 像Illustrator或Inkscape这样的矢量绘图程序,或者如果有数据需要遵循matplotlib。

然后,我会使用POV-Ray或Blender来模拟任何角度的平面,圆形物体的球体(行星?)。已生成的2D图形将成为要映射到平面的纹理。 POV-Ray使用脚本语言,允许为将来的项目保留,修改和复制记录。如果它真的是一次性的,我不介意手工完成,Blender很好。无论使用哪种工具,结果都会显示一幅图像,显示所需的3D几何元素投影到2D中。

圆形的东西,我称之为“行星”的东西在最后的作品中应该是扁平的圆圈,就像在例子中一样?然后我用渲染的3D图像上的矢量绘图应用程序绘制它们。但我怀疑你更喜欢3D中的球体。

显示的样本没有光照或阴影。阴影有助于澄清3D中的几何形状,尽管这两个插图中的第一个并不太糟糕。显示倾斜平面的行星在红线上的短绿线看起来很清楚,但阴影会有所帮助。对于形状,位置以及各种实体的交叉点,第二个插图看起来确实有点混乱。在这里,阴影会有所帮助。 POV-Ray或Blender将很乐意创造这些。更多,被称为光能传递的相互反射有助于在2D图像中看到3D关系。这些高级效果现在很容易做到,不需要光学或图形方面的专业知识,只要知道它存在。

当然,除非有人熟悉3D图形和POV-Ray等工具,否则这个建议并不好。

对于自动化解决方案,在一些快速而肮脏的程序中使用OpenGL可能是最好的。但是,阴影可能需要一些工作。