前言:我知道matplotlib无法处理3D遮挡,对于这种类型的问题,我应该使用Mayavi。这是另一种情况。
我想要实现的是在表面上绘制一条线。该线仅在表面的“此”侧,因此我希望可以通过调整zorder来控制前面的内容。不幸的是,似乎zorder的行为不符合预期。
在下面的实验中,似乎唯一受zorder影响的是折线图,如果zorder> = 3(与散点的zorder无关),线图将位于散点前面如果zorder> = 4(与表面的zorder无关),则表面的前部。
据我所知,matplotlib只是忽略了散点图和表面的zorder并将它们设置为固定值。有没有办法解决这个问题,即对表面和散点施加zorder?
这是下面的MWE的结果。该线在表面上方,但散射点在表面下方。
编辑:我刚刚发现我们可以使用plot
并且不设置任何行来获取类似scatter
的点。这是不理想的,因为我们不能使用scatter
的相同功能,但是它可以作为解决遵循zorder的点的变通方法。
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
cos=np.cos
sin=np.sin
arccos=np.arccos
pi = np.pi
def getxyz(in_theta,in_phi,scale=1.0):
x = scale*sin(in_theta)*cos(in_phi)
y = scale*sin(in_theta)*sin(in_phi)
z = scale*cos(in_theta)
return x,y,z
# ============== SCRIPT ================
# Initialize Figure
fig = plt.figure(figsize=(8,8),dpi=100)
ax = fig.add_subplot(111, projection='3d')
ax.set_aspect("equal")
# Plot Sphere Surface-plot
NS=10
Sx,Sy,Sz = getxyz(*np.mgrid[0:pi/2:NS*2j, 0:pi/2:NS*2j])
ax.plot_surface(Sx,Sy,Sz,rstride=2,cstride=2, color=(0.5,0.5,0.5,0.7),zorder=100)
# Make a line on the sphere
Nl=20
Lx,Ly,Lz = getxyz(np.linspace(pi/3,pi/4,Nl),np.linspace(0,pi/3,Nl))
# Plot Scatter
ax.scatter(Lx,Ly,Lz,s=30,c='k',depthshade=False,zorder=500)
# Plot Line
ax.plot(Lx,Ly,Lz,'r-',zorder=4)
ax.view_init(30, 45)
# fig.savefig("test.png")
plt.show()