我绘制了一条螺旋线和一条应该穿过该螺旋线的线。我无法将线设置为螺旋线的前面的后面和螺旋线的后面的前面。我尝试使用zorder,但该线要么完整位于螺旋线前面,要么完整位于螺旋线后面。谢谢
代码:
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve')
ax.plot([-1,-1], # x
[2,2], # y
[-2, 2], c='red')
plt.show()
例如,在这里。红线在螺旋线的前面。如果我设置zorder,它可能在螺旋之后。如何设置线正确穿过螺旋线?
请注意,matplotlib并非完全3D。为了获得足够的速度来绘制复杂的图,对3D进行了模拟,将所有内容从头到尾绘制,并在特定深度上完整绘制了每个元素。如果需要完整的3D,则值得研究诸如mayavi的软件包。
为了使用matplotlib获取螺旋内部的红线,可以使用以下方法:
请注意,这种方法仅在您不过度旋转视图并且不使用透明度的情况下有效。
现在,仅绘制曲线的一部分,标准方法使用numpy的masked arrays。但是这些似乎并未受到3D图的尊重。另一种方法是将不需要的点设置为NaN
。
为了更好地演示该方法,下面的代码将红线绘制得更宽,并在线前面的螺旋部分使用绿色。对于真实的事物,螺旋线和部分螺旋线将使用相同的颜色。
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve') # the full spiral
ax.plot([-1,-1], # x
[2,2], # y
[-2, 2], c='red', lw=10)
ym = np.copy(y)
ym[y > 0] = np.NaN
ax.plot(x, ym, z, color='lime') # partial spiral
plt.show()