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

时间:2018-02-21 23:15:38

标签: python numpy matplotlib classification data-analysis

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

# 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平面上的投影。

1 个答案:

答案 0 :(得分:0)

你可以玩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)