我想使用matplotlib或多或少地绘制下面附着的图形,其中包括两个相交的平面,其中正确的透明度指示它们的相对方向,以及两个平面中的圆和矢量以2D投影。
我不确定是否存在执行此操作的现有包,任何提示?
答案 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()
我正在运行一个非常接近当前主人的版本,所以我不是 确定哪些版本适用于旧版本
分割绘图的原因是“上方”和“下方”是以某种神秘的方式确定的(我并不完全确定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可能是最好的。但是,阴影可能需要一些工作。