Matplotlib Plot3D曲面/线/散点图如何定义z顺序

时间:2019-05-06 19:01:08

标签: python matplotlib mplot3d

前言:我知道matplotlib无法处理3D遮挡,对于这种类型的问题,我应该使用Mayavi。这是另一种情况。

我想要实现的是在表面上绘制一条线。该线仅在表面的“此”侧,因此我希望可以通过调整zorder来控制前面的内容。不幸的是,似乎zorder的行为不符合预期。

在下面的实验中,似乎唯一受zorder影响的是折线图,如果zorder> = 3(与散点的zorder无关),线图将位于散点前面如果zorder> = 4(与表面的zorder无关),则表面的前部。

据我所知,matplotlib只是忽略了散点图和表面的zorder并将它们设置为固定值。有没有办法解决这个问题,即对表面和散点施加zorder?

这是下面的MWE的结果。该线在表面上方,但散射点在表面下方。

编辑:我刚刚发现我们可以使用plot并且不设置任何行来获取类似scatter的点。这是不理想的,因为我们不能使用scatter的相同功能,但是它可以作为解决遵循zorder的点的变通方法。

Result of the MWE

MWE

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()

0 个答案:

没有答案