如何绘制相交平面?


问题内容

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

我不确定是否有用于执行此操作的现有程序包,是否有任何提示?图片来源:M
Strassler


问题答案:
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实际执行任何操作),并且实际上取决于艺术家的绘制顺序。曲面不能相交(一个在每个位置都将在另一个上方),因此您需要分别在相交的两侧绘制剖面。(您可以在黑色线中看到这一点,而在上面的蓝色平面的“上方”,我并没有看到它的样子)。

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