【问题标题】:How to plot multiple three-dimensional surface plots with matplotlib in the same plane如何在同一平面上用matplotlib绘制多个三维曲面图
【发布时间】:2018-02-21 23:15:37
【问题描述】:

我的目标是绘制两个类别的概率分布函数 (pdf)。每个类都有高斯似然和等效协方差矩阵,但均值向量不同。我希望两个 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 平面上的投影。

【问题讨论】:

    标签: python numpy matplotlib classification data-analysis


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-12-21
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多