3d图中对象的顺序-螺旋

问题描述 投票:1回答:1

我绘制了一条螺旋线和一条应该穿过该螺旋线的线。我无法将线设置为螺旋线的前面的后面和螺旋线的后面的前面。我尝试使用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()

enter image description here

例如,在这里。红线在螺旋线的前面。如果我设置zorder,它可能在螺旋之后。如何设置线正确穿过螺旋线?

python-3.x 3d
1个回答
0
投票

请注意,matplotlib并非完全3D。为了获得足够的速度来绘制复杂的图,对3D进行了模拟,将所有内容从头到尾绘制,并在特定深度上完整绘制了每个元素。如果需要完整的3D,则值得研究诸如mayavi的软件包。

为了使用matplotlib获取螺旋内部的红线,可以使用以下方法:

  1. 绘制螺旋线
  2. 画红线
  3. 再次绘制螺旋线,但仅绘制直线前的部分

请注意,这种方法仅在您不过度旋转视图并且不使用透明度的情况下有效。

现在,仅绘制曲线的一部分,标准方法使用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()

resulting plots

© www.soinside.com 2019 - 2024. All rights reserved.