如何在同一平面内用matplotlib绘制多个三维曲面图

How to plot multiple three-dimensional surface plots with matplotlib in the same plane

我的目标是绘制两个 classes 的概率分布函数 (pdf)。每个 class 具有高斯似然和等效协方差矩阵,但均值向量不同。我希望两个 pdf 在 z 轴的同一平面上,x 和 y 轴包含 pdf 的投影。 以下代码(主要是从 here 借来的)绘制了其中一个 pdf:

# Our 2-dimensional distribution will be over variables X and Y
N = 100
X = np.linspace(-10, 15, N)
Y = np.linspace(-10, 15, N)
X, Y = np.meshgrid(X, Y)

# Mean vector and covariance matrix
mu1 = np.array([8, 2])
mu2 = np.array([2,8])
Sigma1 = Sigma2 = np.array([[4.1,0],[0,2.8]])


# Pack X and Y into a single 3-dimensional array
pos = np.empty(X.shape + (2,))
pos[:, :, 0] = X
pos[:, :, 1] = Y

F1 = multivariate_normal(mu1, Sigma1)
F2 = multivariate_normal(mu2, Sigma2)
Z1 = F1.pdf(pos)
Z2 = F2.pdf(pos)
# Create a surface plot and projected filled contour plot under it.
fig1 = plt.figure(figsize=[10,10])

ax1 = fig1.gca(projection='3d')

ax1.plot_surface(X, Y, Z1, rstride=3, cstride=3, linewidth=1, 
antialiased=True,cmap=cm.inferno)

cset = ax1.contourf(X, Y, Z1, zdir='z', offset=-0.15, cmap=cm.inferno)

# Adjust the limits, ticks and view angle
ax1.set_zlim(-0.15,0.2)
ax1.set_zticks(np.linspace(0,0.2,5))
ax1.view_init(27, -21)


 plt.show()

这是上述代码的结果图:plot_surfaces for plotting bivariate pdf。但是,我需要在同一平面上绘制 Z1 和 Z2。如果我尝试创建两个图,它们会重叠并且无法看到 Z2 pdf。稍微调整一下代码,我大致得到了我想要的:

ax1 = fig1.gca(projection='3d')
ax2 = fig1.gca(projection='3d')
ax1.plot_wireframe(X, Y, Z1, rstride=3, cstride=3, linewidth=1, 
antialiased=True,cmap=cm.inferno)

ax2.plot_wireframe(X,Y,Z2,rstride=3, cstride=3, linewidth=1, 
antialiased=True,cmap=cm.inferno)

可以在此处找到其结果图:wireframe method to plot 2 bivariate pdfs。但这些情节仍然重叠。我怎样才能解决这个问题?我希望将结果设置为第一个图的样式,使用 surface_plot 方法和 x-y 平面上的投影。

你可以玩 alpha:

ax1.plot_surface(X, Y, Z1, rstride=3, cstride=3, linewidth=1,
antialiased=True,cmap=cm.inferno, alpha = 0.5)
ax1.plot_surface(X, Y, Z2, rstride=3, cstride=3, linewidth=1,
antialiased=True,cmap=cm.inferno, alpha = 1)
cset = ax1.contourf(X, Y, Z1, zdir='z', offset=-0.15, cmap=cm.inferno, alpha=1)
cset = ax1.contourf(X, Y, Z2, zdir='z', offset=-0.15, cmap=cm.inferno, alpha=0.5)

但在某些情况下,您只需对 pdf 求和即可获得相同的结果

ax1.plot_surface(X, Y, Z1 + Z2, rstride=3, cstride=3, linewidth=1, antialiased=True,cmap=cm.inferno)
cset = ax1.contourf(X, Y, Z1 + Z2, zdir='z', offset=-0.15, cmap=cm.inferno)