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

如何用Matplotlib制作带光晕散点图并展示高斯潜空间不确定性

如何用Matplotlib绘制带光晕效果的散点图(展示高斯潜空间不确定性)

嘿,我来帮你解决这个问题!Matplotlib确实没有专门的「光晕效果」API,但我们可以用一些小技巧来模拟出你想要的效果,完美展示高斯潜空间的不确定性。下面给你两种实用的方法:

方法一:多层半透明散点模拟光晕

这种方法通过生成不同层级的样本点,用透明度和尺寸的差异来营造光晕感,直观体现高斯分布的扩散范围:

首先导入需要的库:

import matplotlib.pyplot as plt
import numpy as np

然后模拟你的高斯随机变量参数,这里我准备了几个示例:

# 定义多个高斯分布的参数:(均值x, 均值y, x标准差, y标准差, 相关系数)
gaussian_params = [
    (2, 3, 0.5, 0.8, 0.3),
    (-1, 1, 0.7, 0.4, -0.5),
    (0, -2, 0.6, 0.6, 0.0)
]

接下来绘制光晕散点图:

plt.figure(figsize=(8, 6))

for mu_x, mu_y, sigma_x, sigma_y, rho in gaussian_params:
    # 构建协方差矩阵
    cov_matrix = [[sigma_x**2, rho*sigma_x*sigma_y],
                  [rho*sigma_x*sigma_y, sigma_y**2]]
    
    # 外层光晕:大量样本点,低透明度,大尺寸
    outer_samples = np.random.multivariate_normal([mu_x, mu_y], cov_matrix, 1000)
    plt.scatter(outer_samples[:, 0], outer_samples[:, 1], 
                s=50, alpha=0.05, color='royalblue')
    
    # 中层过渡:中等数量样本,中等透明度和尺寸
    mid_samples = np.random.multivariate_normal([mu_x, mu_y], cov_matrix, 200)
    plt.scatter(mid_samples[:, 0], mid_samples[:, 1], 
                s=20, alpha=0.2, color='royalblue')
    
    # 中心均值点:高透明度,突出标记,明确分布中心
    plt.scatter(mu_x, mu_y, s=100, alpha=1, color='darkblue', marker='*')

plt.xlabel('潜空间维度X')
plt.ylabel('潜空间维度Y')
plt.title('高斯潜空间的光晕散点图(展示不确定性)')
plt.grid(alpha=0.3)
plt.show()

方法二:基于核密度的平滑光晕

如果你想要更平滑的光晕效果,可以用高斯核密度估计来绘制密度填充区域,这种方式能更细腻地体现分布的不确定性:

需要额外导入scipy的核密度模块:

from scipy.stats import gaussian_kde

然后绘制平滑光晕图:

plt.figure(figsize=(8, 6))

for mu_x, mu_y, sigma_x, sigma_y, rho in gaussian_params:
    cov_matrix = [[sigma_x**2, rho*sigma_x*sigma_y],
                  [rho*sigma_x*sigma_y, sigma_y**2]]
    # 生成样本点用于核密度计算
    samples = np.random.multivariate_normal([mu_x, mu_y], cov_matrix, 500)
    
    # 计算高斯核密度
    kde = gaussian_kde(samples.T)
    
    # 生成绘图网格
    x_range = (mu_x - 3*sigma_x, mu_x + 3*sigma_x)
    y_range = (mu_y - 3*sigma_y, mu_y + 3*sigma_y)
    xx, yy = np.mgrid[x_range[0]:x_range[1]:100j, y_range[0]:y_range[1]:100j]
    positions = np.vstack([xx.ravel(), yy.ravel()])
    
    # 计算网格上的密度值
    density_values = kde(positions).reshape(xx.shape)
    
    # 绘制填充等高线作为光晕,用颜色深浅和透明度体现密度
    plt.contourf(xx, yy, density_values, levels=10, cmap='Blues', alpha=0.3)
    
    # 叠加中心均值点
    plt.scatter(mu_x, mu_y, s=100, alpha=1, color='darkblue', marker='*')

plt.xlabel('潜空间维度X')
plt.ylabel('潜空间维度Y')
plt.title('高斯潜空间的平滑光晕图(基于核密度)')
plt.grid(alpha=0.3)
plt.show()

额外小技巧

如果你的示例图包含明确的误差范围(比如1σ、2σ椭圆),可以结合matplotlib.patches.Ellipse绘制误差椭圆,再和光晕效果叠加,进一步增强不确定性的表达。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:09