Python 绘制线和曲面以及正确的遮挡

Python 绘制线和曲面以及正确的遮挡,python,matplotlib,surface,Python,Matplotlib,Surface,我希望使用Python和matplotlib在一个绘图中绘制一个二维概率分布,其中一个边缘。我就快到了,但是图中的线总是画在曲面的前面,而不是被正确地遮挡。我该如何解决这个问题 import numpy as np import scipy.stats as stats import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import axes3d fig = plt.figure() ax = fig.gca(project

我希望使用Python和matplotlib在一个绘图中绘制一个二维概率分布,其中一个边缘。我就快到了,但是图中的线总是画在曲面的前面,而不是被正确地遮挡。我该如何解决这个问题

import numpy as np

import scipy.stats as stats

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

fig = plt.figure()
ax = fig.gca(projection='3d')

delta = 0.05
f = 0.5

X, Y = np.meshgrid(np.arange(-3.0, 3.0, delta),
                   np.arange(-3.0, 3.0, delta))
xy = np.hstack((X.flatten()[:, None], Y.flatten()[:, None]))

p1 = stats.multivariate_normal.pdf(xy, mean=[1, -1], cov=(np.eye(2) * 0.28 * f))
p2 = stats.multivariate_normal.pdf(xy, mean=[-1, 1], cov=(np.eye(2) * 0.5 * f))

p = 0.3 * p1 + 0.7 * p2
Z = p.reshape(len(X), len(X))

plt.plot(X[0, :], np.zeros(len(X)) + 3, np.sum(Z, 0) * 0.05) # , color='red')

ax.plot_surface(X, Y, Z, alpha=1.0, cmap='jet', linewidth=0.1, rstride=2, cstride=2)

ax.set_xlabel('Object colour')
ax.set_ylabel('Illumination colour')
ax.set_zlabel('Probability density')
ax.set_zlim(min(cont_offset, np.min(Z)), max(np.max(Z), cont_offset))

plt.show()

内置的
contour
函数至少可以获得正确的z顺序;如果你不想要完整的东西,你可以用计算过的
Z
作弊。首先,将对
plt.plot
的调用替换为:

from matplotlib import cm
cset = ax.contour(X, Y, Z, zdir='y', offset=3, cmap='binary')
cset = ax.contour(X, Y, Z, zdir='x', offset=-3, cmap='Blues')

为轮廓伪造Z,单向:

from matplotlib import cm
Zys = np.zeros_like(Z)
Zys[60,:] = Z.max(0)
cset = ax.contour(X, Y, Zys, zdir='y', offset=3, cmap='binary')
Zys = np.zeros_like(Z)
Zys[:,60] = Z.max(1)
cset = ax.contour(X, Y, Zys, zdir='x', offset=-3, cmap='Blues')

更雄心勃勃的是,在
轮廓的某个地方
代码中,他们正在计算z阶

plt.plot有一个zorder参数,但我不确定这在3D Axis中是否有意义。mltools是我制作的一个小库,我重写了代码以使用scipy,因此它可以在不进行编辑的情况下运行。zorder在我的情况下似乎不起作用。示例代码中也缺少cont_offset,但zorder也不适用于我。3D应该会处理它。人们通常推荐mayavi进行3d绘图;你能试试吗?太好了,非常感谢。这是可行的,尽管我必须通过在一个轴上传递一个恒定的Z来作弊。等高线_plot=ax.等高线(X,Y,np.tile(marginal,[len(marginal),1]),zdir='Y',offset=3)Ha,很高兴它成功了!我只是在研究一种不同的强制进给方式
contour
。可惜它计算出的轮廓比它需要的要多。