在mplot3d中绘制与曲面相交的3d线(matplotlib python)

时间:2019-07-20 10:14:17

标签: python-2.7 matplotlib mplot3d

我试图绘制一个表面和一条穿过它的线。我想绘制一个图,其中隐藏在表面后面的线的一部分。

我在matplotlib中尝试过此操作,但表面后面的线的部分也可见。

Line intersecting a surface

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

x = np.arange(0,10,1)
y = np.arange(0,10,1)
z = np.arange(0,10,1)

X, Y = np.meshgrid(x,y)
Z= np.ones((len(x),len(x)))*5

fig = plt.figure()
ax1 = fig.gca(projection='3d')
ax1.plot_surface(X, Y, Z, color='red', edgecolor='black')
ax1.plot(x,y,z,'-',color='black',linewidth=4)
plt.show()

1 个答案:

答案 0 :(得分:1)

在matplotlib中,有一个zorder的概念。根据{{​​3}},zorder较高的对象被绘制在zorder较低的对象之上。默认情况下,色块的zorder比线条高,这就是为什么您的红色表面似乎会遮挡线条的原因。在这里,通过选择分别位于z <= 5z >= 5的索引,为该行的背景和前景部分创建了一组新的坐标。然后,我分别绘制这两组点,为所有三个点-曲面和两条线都设置zorder

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

x = np.arange(0, 10, 1)
y = np.arange(0, 10, 1)
z = np.arange(0, 10, 1)

x_background = x[z <= 5]
y_background = y[z <= 5]
z_background = z[z <= 5]
x_foreground = x[z >= 5]
y_foreground = y[z >= 5]
z_foreground = z[z >= 5]

X, Y = np.meshgrid(x, y)
Z = np.ones((len(x), len(x))) * 5

fig = plt.figure()
ax1 = fig.gca(projection='3d')
ax1.plot_surface(X, Y, Z, color='red', edgecolor='black', zorder=1)
ax1.plot(
    z_background, z_background, z_background, '-', color='black', linewidth=4,
    zorder=2)
ax1.plot(
    z_foreground, z_foreground, z_foreground, '-', color='black', linewidth=4,
    zorder=3)
plt.show()

the docs

希望这会有所帮助!