You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Matplotlib在同一平面绘制两类高斯PDF的三维曲面图

Got it! 要在同一个3D坐标系里绘制两个协方差相同、均值不同的高斯PDF曲面其实很简单——你只需要在同一个3D绘图轴上依次渲染两个曲面就行。我给你整理了完整的可运行代码和关键说明,直接参考就能搞定:

核心思路

  1. 先实现通用的多元高斯PDF计算函数,支持输入任意均值、协方差和网格数据
  2. 生成x/y轴的网格点作为PDF的输入变量
  3. 定义两类的均值向量和共同协方差矩阵
  4. 分别计算两个PDF的z轴密度值
  5. 在同一个3D轴上绘制两个曲面,通过透明度和颜色区分,避免遮挡

完整代码示例

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

# 定义多元高斯PDF计算函数
def gaussian_pdf(x, y, mean, cov):
    # 将x/y网格转换为样本点矩阵
    xy_samples = np.vstack([x.ravel(), y.ravel()]).T
    # 计算协方差的逆和行列式(用于PDF公式)
    inv_cov = np.linalg.inv(cov)
    det_cov = np.linalg.det(cov)
    # 计算指数部分
    exponent = -0.5 * np.sum((xy_samples - mean) @ inv_cov * (xy_samples - mean), axis=1)
    # 计算PDF值并还原为网格形状
    pdf_values = (1 / (2 * np.pi * np.sqrt(det_cov))) * np.exp(exponent)
    return pdf_values.reshape(x.shape)

# 1. 创建x/y轴的网格数据
x_range = np.linspace(-5, 5, 100)
y_range = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x_range, y_range)

# 2. 定义两类的参数(协方差相同,均值不同)
mean_class1 = np.array([-1.5, -1.5])
mean_class2 = np.array([1.5, 1.5])
shared_cov = np.array([[1.2, 0.6], [0.6, 1.2]])  # 共同的协方差矩阵

# 3. 计算两个PDF的z轴值
Z1 = gaussian_pdf(X, Y, mean_class1, shared_cov)
Z2 = gaussian_pdf(X, Y, mean_class2, shared_cov)

# 4. 绘制3D双曲面
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制第一个曲面(蓝色半透明)
surf1 = ax.plot_surface(X, Y, Z1, cmap=cm.Blues, alpha=0.7)
# 绘制第二个曲面(橙色半透明)
surf2 = ax.plot_surface(X, Y, Z2, cmap=cm.Oranges, alpha=0.7)

# 设置坐标轴与标题
ax.set_xlabel('X Variable', fontsize=10)
ax.set_ylabel('Y Variable', fontsize=10)
ax.set_zlabel('Probability Density', fontsize=10)
ax.set_title('Two Gaussian PDFs (Same Covariance, Different Means)', fontsize=12)

# 添加图例(3D曲面的图例需要手动绑定对象)
ax.legend([surf1, surf2], ['Class 1 PDF', 'Class 2 PDF'], loc='upper right')

# 调整视角,让两个曲面都清晰可见
ax.view_init(elev=35, azim=50)

plt.tight_layout()
plt.show()

关键细节说明

  • 透明度设置:通过alpha=0.7让两个曲面半透明,这样重叠区域不会完全遮挡,能同时看到两个曲面的形状
  • 图例处理:3D曲面的label参数不会自动生效,需要手动把曲面对象传入legend()函数
  • 视角调整:用view_init()调整俯仰角(elev)和方位角(azim),找到最适合观察两个曲面的角度

内容的提问来源于stack exchange,提问作者Sibs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:22:12